Запрос с вложенным GROUP BY - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу применить два разных угла запроса в одном утверждении. У меня есть таблица клиентов с информацией о городе и количестве продуктов, которые они купили как

    c_id,city,no_products
    1, city1,0
    2, city2,20
    3, city2,80
    4,city1,10

Сводка, которую я ищу, сгруппирована по городам, а также по номеру no_products, включая 0 отсчетов для диапазона, который не является существовал в табл. Диапазоны предопределены как grpA = no_products в диапазоне от 0 до 50, grpB = no_products в диапазоне от 51 до 100.

city,total_customers,grpA,grpB
city1,2,2,0
city2,2,1,1

Так же, как и выше, я хочу, чтобы select City,count(*) as city_customer_count from C_tbl group by City

был вложен с

select t.range as [GROUPS], count(*) as [number of customers]
from (
  select case  
    when no_products between 0 and 20 then N'GROUPC'
    when no_products between 21 and 80 then N'GROUPB'
    when no_products > 80 then N'GROUPA'
     end as range
  from C_tbl) t
group by t.range

Однако в приведенном выше запросе также не учитывается 0 для несуществующего диапазона.

1 Ответ

2 голосов
/ 20 апреля 2020

Для этого можно использовать условное агрегирование:

SELECT city,
       COUNT(*) AS total_customers,
       COUNT(CASE WHEN no_products BETWEEN 0 AND 50 THEN 1 END) AS grpA,
       COUNT(CASE WHEN no_products BETWEEN 51 AND 100 THEN 1 END) AS grpB
FROM C_tbl
GROUP BY city

Вывод:

city    total_customers     grpA    grpB
city1   2                   2       0
city2   2                   1       1

Демонстрация по SQLFiddle

...