Показать результаты CUBE PostgreSQL со всеми возможными измерениями - PullRequest
0 голосов
/ 03 января 2019

Я использую следующий запрос для получения результатов куба для сводной таблицы:

SELECT
    client,
    shop,
    SUM (sales)
FROM
    sales
GROUP BY
    CUBE (client, shop)
ORDER BY
    client,
    shop;

И получите вывод:

client     shop       sales
null       null        1000
null       Shop A       400
null       Shop B       600
Client A   null         800
Client A   Shop A       200
Client A   Shop B       600
Client B   null         200
Client B   Shop A       200

Обратите внимание, что Клиент B продает товары только в Магазин A.

Но мне нужен вывод (добавил последнюю строку), где вывод показывает все возможные пересечения в измерениях (клиент, магазин). Как изменить мой запрос?

client     shop       sales
null       null        1000
null       Shop A       400
null       Shop B       600
Client A   null         800
Client A   Shop A       200
Client A   Shop B       600
Client B   null         200
Client B   Shop A       200
Client B   Shop B      null

1 Ответ

0 голосов
/ 03 января 2019

Вам необходимо запросить декартово произведение client и shop, соединенное слева с таблицей:

select 
    client, 
    shop, 
    sum(sales)
from (
    select distinct client 
    from sales
    ) c
cross join (
    select distinct shop 
    from sales
    ) s
left join 
    sales t using (client, shop)
group by 
    cube(client, shop)
order by 
    client, shop;

  client  |  shop  | sum  
----------+--------+------
 Client A | Shop A |  200
 Client A | Shop B |  600
 Client A |        |  800
 Client B | Shop A |  200
 Client B | Shop B |     
 Client B |        |  200
          | Shop A |  400
          | Shop B |  600
          |        | 1000
(9 rows)        
...