2016-12-31 5 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'? По внешнему виду имя, вероятно, является текстовым столбцом. Сумма чего? – 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

Да, я просто пытался отформатировать его. Спасибо @Hogan – coderredoc

+1

Этот ответ очень не прав. Пожалуйста, проверьте, почему. – Hogan

+0

@ Хоган: позвольте мне проверить .. – coderredoc

1

Если я правильно понял, вы хотите узнать некоторые столбцы из мета-таблиц, которые вы хотите суммировать, а затем суммировать эти столбцы в данной таблице. Вы можете использовать динамический SQL для достижения этой цели:

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 yes - 1 + 2 = 3 - не читал внимательно – Hogan

2

Другой вариант, который не требует динамического SQL, но только CROSS ОТНОСИТЬСЯ или два

Просто для удовольствия, я добавить Мин, Макс и Сред только для иллюстрации ... Также добавлен 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 eturns

enter image description here

+0

точно так же, как я говорил - используйте xml. очень симпатичный ответ. Становится ли это медленнее, когда есть много столбцов ... этот парень добавляет 12 в год. – Hogan

+0

@Hogan Я предполагаю, что «симпатичный ответ» - это комплимент, а не просто насмешка над мной. Производительность респектабельна. Просто запустил тест на 6 681 запись с 24 столбцами, чтобы добавить (коэффициенты кривой доходности). Результаты, возвращенные за 0,634 секунды (при потоковой передаче NetFlix) –

+1

Да, милый ответ был комплиментом - этот метод является def. в моей сумке трюков. (скорость передачи мало влияет на производительность, я думаю - так кто заботится о NetFlix?) Я попробую это на пару миллионов строк, когда я войду во вторник и дам вам знать. – Hogan

Смежные вопросы