сгруппировать и выбрать ненулевое значение, если оно присутствует - PullRequest
0 голосов
/ 10 июля 2019

Есть ли способ, которым я могу выполнить group by и использовать не значение для столбца, если таковые имеются. * 1002 т.е. *

a  | b | c | d    | e       | f                   |
---------------------------------------------------
1  | 2 | 3 | x    | test1   | 2019-07-01 07:17:01 |
1  | 2 | 3 | NULL | test2   | 2019-07-01 10:23:11 |
1  | 2 | 3 | NULL | test3   | 2019-07-01 22:00:51 |
1  | 2 | 7 | NULL | testTet | 2019-07-01 23:00:00 |

В моем случае выше, если присутствует d, скажем, a=1,b=2,c=3, оно всегда будет x, иначе оно может быть нулевым. Так что мой запрос будет выглядеть как

select a,
       b,
       c,
       d,
       count(distinct e) as something
from tableX
where f between '2019-07-01 00:00:00' and '2019-07-01 23:59:59.999'
group by a,
         b,
         c,
         d

результаты будут:

a  | b | c | d    | something |
------------------------------|
1  | 2 | 3 | x    | 1         |
1  | 2 | 3 | NULL | 2         |
1  |2  | 7 | NULL | 1         |

тогда как было бы замечательно, если бы я мог иметь (поскольку для каждой комбинации group by я знаю, что она равна нулю или это уникальное значение, если присутствует):

a  | b | c | d    | something |
------------------------------|
1  | 2 | 3 | x    | 3         |
1  | 2 | 7 | NULL | 1         |

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Из ваших примеров данных я думаю, что вам не нужно d в предложении group by.
Так что получите его максимум:

select 
  a, b, c, 
  max(d) d,
  count(distinct e) as something
from tableX
where f between '2019-07-01 00:00:00' and '2019-07-01 23:59:59.999'
group by a, b, c
1 голос
/ 10 июля 2019

попробуйте как показано ниже

with cte as (select a,
       b,
       c,
       d,
       count(distinct e) as something
from tableX
where f between '2019-07-01 00:00:00' and '2019-07-01 23:59:59.999'
group by a,
         b,
         c,
         d) select a,b,c,max(d) as d,sum(something) from cte group by a,b,c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...