SQL GROUP BY с нулевыми значениями - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть эти данные в таблице MSSQL 2012r2:

id   data1  amount
------------------
10   abc     95.00
10   NULL   312.00
20   def     16.00
30   gqi     32.00 

Ожидаемый результат запроса:

id   data1  amount
------------------
10   abc    407.00
20   def     16.00
30   gqi     32.00

это возможно, используя только sql?

Ответы [ 6 ]

2 голосов
/ 19 апреля 2019

case when также может помочь вам

select id, case when data1 is null then 'abc' else data1 end
          as data1, sum(amount) from table_name
         group by id,case when data1 is null then 'abc' else data1 end
2 голосов
/ 19 апреля 2019

использовать max(), sum() агрегированную функцию и group by

select id, max(data1),sum(amount)
from tablename
group by id
1 голос
/ 19 апреля 2019

Если вы хотите, чтобы NULL был похож на 'abc', тогда используйте coalesce():

select id, coalesce(data1, 'abc') as data1,
       sum(amount) as amount
from t
group by id, coalesce(data1, 'abc');

Это создаст произвольную строку 'abc', если она не существует.Если вы просто хотите, чтобы оно было объединено с любым существующим значением:

select t.id, coalesce(t.data1, t2.data1) as data1,
       sum(t.amount) as amount
from t outer apply
     (select top (1) t2.data1
      from t t2
      where t2.id = t.id and t2.data1 is  not null
     ) t2
group by t.id, coalesce(t.data1, t2.data1);
0 голосов
/ 19 апреля 2019

выберите идентификатор, максимум (данные1) данные1, сумма (сумма) сумма из таблицы сгруппировать по идентификатору

0 голосов
/ 19 апреля 2019
select id, COALESCE(data1 ,'anyvalue') as data1, sum(amount) as amount 
from <table>
group by id , COALESCE(data1,'anyvalue')
0 голосов
/ 19 апреля 2019

Пожалуйста, попробуйте это.

select t1.id, coalesce(t1.data1,t2.data1)
from Table t1 join (select id, sum(amount) from Table group by id) t2 
on t1.id = t2.id 

здесь, главная проблема заключается только в том, как получить ненулевое значение среди нескольких столбцов.Таким образом, мы можем достичь этого с помощью функции объединения .

Что делает функция объединения?

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

Пример:

ВЫБЕРИТЕ COALESCE (NULL, NULL, NULL, 'W3Schools.com', NULL, 'Example.com');

После выполнения вышеуказанного SQL-запроса он возвращает.

W3Schools.com

, которое вначале не является нулевым значением.

https://www.w3schools.com/sql/func_sqlserver_coalesce.asp

...