2016-12-31 3 views
2
SELECT 
    name 
FROM 
    sys.all.column 
WHERE object_id = (SELECT object_id 
        FROM sys.all_objects 
        WHERE name ='name of my table' and type = 'TT') 
    AND name NOT IN (list of columns that I don't need) 

이전 SQL 쿼리에서 반환 된 열의 값을 모두 합계하려면 어떻게합니까?SQL Server에서 여러 열의 값을 합하는 방법

+0

당신은'반환 columns'의 모든 값의 합계 무엇을 의미합니까 eturns? 외모로 보면 이름은 아마도 텍스트 열일 것입니다. 무엇의 합계? – GurV

+0

코드는 지정된 표의 모든 열을 반환합니다. 특정 행의 각 열의 값을 합산하여 하나의 행의 값을 합산하고자하므로 –

+0

을 원하십니까? 왜 열 이름을 쓸 수 없습니까? 몇 개의 열이 있습니까? – Hogan

답변

0
select col1,col2,col3,col4,NVL(col1,0)+NVL(col2,0)+NVL(col3,0)+NVL(col4,0) 
from 
(select * 
from sys.all.column 
where object_id =(select object_id from sys.all.object where name ='name of my table') 
    and name not in (list of columns that I dont need).) 


    A | B | Total(col1+col2) 
------+------+------- 
    1 | 2 | 3 
--------------------- 
    1 |  | 1 

얻을 수있는 열이 무엇이든 관계없이 결과 테이블에 별도의 열로 입력하십시오.

+0

예. 그냥 포맷하려고했습니다. 감사합니다. 호건 – coderredoc

+1

이 답변은 매우 잘못되었습니다. 테스트 해보고 이유를 확인하십시오. – Hogan

+0

@Hogan .: 확인해 보겠습니다. – coderredoc

1

정확하게 이해하면 합계를 원하는 메타 테이블의 일부 열을 찾아서 주어진 테이블의 해당 열을 더하고 싶습니다.

create table t(a integer, b integer, c integer); 

insert into t values(1,2,3); 

declare @tab varchar(100); 
declare @sql varchar(max); 
set @sql = ''; 
set @tab = 't'; 

select @sql = @sql + '+' + a.name from sys.all_columns a 
inner join 
sys.all_objects b 
on a.object_id = b.object_id 
where b.name = @tab 
and a.name not in ('c'); 

set @sql = 'select ' + stuff(@sql, 1, 1, '') + ' from ' + @tab; 

exec(@sql); 

가 생산 :

3 
+0

은 1 + 2 + 3 = 6이 아니므로? – Hogan

+0

@Hogan'및 a.name이 ('c')가 아님; 열을 무시하는 방법을 보여주는 예 – GurV

+1

ah 예 - 1 + 2 = 3 -주의 깊게 읽지 않았습니다. – Hogan

2

동적 SQL을 필요로하지 않는 다른 옵션으로, 오직 십자가가 적용 또는 두 개의

그냥 재미를 위해, 나는이 작업을 달성하기 위해 동적 SQL을 사용할 수 있습니다 설명하기 위해 Min, Max 및 Avg를 추가하십시오. 또한 PctOfTotal 또는 Common-Size를 추가했습니다.

Declare @YourTable table (ID int,CustName varchar(50),Sales_Jan int,Sales_Feb int,Sales_Mar int) 
Insert into @YourTable values 
(1,'John Smith',25,25,50), 
(2,'Jane Doe' ,35,20,null) 

Select A.* 
     ,C.* 
     ,PctOfTotal = Format(C.Total*1.0/Sum(C.Total) over(),'0.00%') 
From @YourTable A 
Cross Apply (Select XMLData=cast((Select A.* For XML RAW) as xml)) B 
Cross Apply (
       Select Total = Sum(Value) 
         ,Min = Min(Value) 
         ,Max = Max(Value) 
         ,Avg = Avg(Value) 
       From (
         Select Value = attr.value('.','int') 
         From B.XMLData.nodes('/row') as A(r) 
         Cross Apply A.r.nodes('./@*') AS B(attr) 
         Where attr.value('local-name(.)','varchar(100)') Like 'Sales_%' 
         --Or you can Exclude Specific Columns 
         --Where attr.value('local-name(.)','varchar(100)') not in ('ID','CustName') 
         ) S 
      ) C 

R

enter image description here

+0

정확히 말하자면 - xml을 사용하십시오. 아주 귀여운 대답. 많은 열이있는 곳에서는 속도가 느려지 는가 ....이 녀석은 일년에 12 명을 추가하고있다. – Hogan

+0

@Hogan 나는 "귀여운 대답"은 칭찬이며 나를 조롱하는 것이 아니라고 가정합니다. 성능은 존경받을 만합니다. 24 개의 열이있는 6,681 개의 레코드에 대한 테스트를 실행하여 수익률 곡선 비율을 추가했습니다. 결과는 0.634 초로 반환되었습니다 (NetFlix 스트리밍 중) –

+1

귀여운 대답은 칭찬이었습니다. 속임수 봉투에 들어갔다. (전송 속도는 성능에 거의 영향을 미치지 않습니다. 추측 일 것입니다. NetFlix에 관심이있는 사람은 누구입니까?) 제가 화요일에 들어올 때 2 백만 행을 시도해보고 알려 드리겠습니다. – Hogan

관련 문제