Вычислить сумму строк в SQL Server [duplicate]

Я написал анализатор XML общего назначения, который может легко обрабатывать файлы GB. Он основан на XMLReader, и он очень прост в использовании:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

Вот github repo: XmlExtractor

3
задан Sean Branchaw 8 December 2015 в 16:41
поделиться

3 ответа

Вы не указали свою попытку запроса, но, вероятно, это примерно так:

SELECT
  ID, Q1, Q2, Q3, Q4,
  Q1 + Q2 + Q3 + Q4 AS "Total"
FROM MyTable

Если значения из Q1, Q2, Q3 или Q4 null, Q1 + Q2 + Q3 + Q4 будет null. Для обработки нулей как нуля и получения правильной суммы сделайте это вместо этого:

SELECT
  ID, Q1, Q2, Q3, Q4,
  COALESCE(Q1,0) + COALESCE(Q2,0) + COALESCE(Q3,0) + COALESCE(Q4,0) AS "Total"
FROM MyTable

Функция COALESCE вернет первое ненулевое значение в списке.

6
ответ дан Ed Gibbs 24 August 2018 в 02:48
поделиться

Не знаю, есть ли у него более короткий путь, но самый элегантный, который я могу сделать, это:

select
    ID, Q1, Q2, Q3, Q4,
    (
         select sum(S.Q)
         from (values (Q1), (Q2), (Q3), (Q4)) as S(Q)
         where S.Q is not null
    ) as [Total]
from Table1 as T

демо-версия скрипта sql

Если вам нужен динамический SQL, попробуйте что-то вроде

declare @stmt nvarchar(max), @stmt1 nvarchar(max)

select
    @stmt = isnull(@stmt + ', ', '') + name,
    @stmt1 = isnull(@stmt1 + ', ', '') + '(' + name + ')'
from sys.columns
where object_id = object_id('Table1') and name not in ('ID')

select @stmt =
          'select ID, ' + @stmt + 
          ', (select sum(S.Q) from (values ' + @stmt1 +
          ') as S(Q) where S.Q is not null) as [Total] ' +
          'from Table1 as T'

exec sp_executesql @stmt = @stmt

sql скрипт demo

2
ответ дан Roman Pekar 24 August 2018 в 02:48
поделиться

Расширение на Roman Pekar. Если вы используете временную таблицу и хотите это сделать, вам нужно использовать tempdb следующим образом:

select
@stmt = isnull(@stmt + ', ', '') + '[' + name + ']',
@stmt1 = isnull(@stmt1 + ', ', '') + '(' + '[' + name + ']'+  ')'
from tempdb.sys.columns
where object_id = object_id('tempdb..##TempTable') and name not in ('ID')
--ID would be one of the column names you DONT want to sum.
--also notice the double pound sign. you need to declare your temp table with double pounds or it wont work
--also notice how I put brackets around name, that's because my columns weren't working because they had slashes in their names.
--the rest of the code is the same
select @stmt =
          'select Date_Packed, ' + @stmt + '' + 
          ', (select sum(S.Q) from (values ' + @stmt1 +
          ') as S(Q) where S.Q is not null) as [Total] ' +
          'from tempdb..##TempTableas T'
          print @stmt

exec sp_executesql @stmt = @stmt
--don't forget to drop it
          drop table ##TempTable
0
ответ дан user1944720 24 August 2018 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: