模拟没有该关键字的汇总

发布于 2025-02-08 01:06:43 字数 777 浏览 3 评论 0 原文

在Postgres中,我可以通过执行以下查询来模拟二维枢轴表:

SELECT ... FROM ...
GROUP BY
    ROLLUP(x,y,z), -- ROWS
    ROLLUP(a,b,c)  -- COLS

作为具体示例在dbfiddle 中:

​我知道可以使用 union all 进行一维 crodup ,例如:

SELECT a, b, SUM(c) FROM Input GROUP BY ROLLUP(a, b);
-->
SELECT NULL, NULL, SUM(c) FROM Input               UNION ALL
SELECT a,    NULL, SUM(c) FROM Input GROUP BY a    UNION ALL
SELECT a,    b,    SUM(c) FROM Input GROUP BY a, b;

但是,如果不访问 lollup 关键词?我们在此处使用Postgres(或MySQL)作为数据库,但是在您的答案中,请避免使用 Rollup 关键字。

In postgres, I can emulate a two dimensional pivot table by doing a query such as:

SELECT ... FROM ...
GROUP BY
    ROLLUP(x,y,z), -- ROWS
    ROLLUP(a,b,c)  -- COLS

As a concrete example in dbfiddle:

enter image description here

However, if a database did not have access to the ROLLUP keyword, how could this be emulated? I know a one-dimensional ROLLUP could be done with a UNION ALL, such as:

SELECT a, b, SUM(c) FROM Input GROUP BY ROLLUP(a, b);
-->
SELECT NULL, NULL, SUM(c) FROM Input               UNION ALL
SELECT a,    NULL, SUM(c) FROM Input GROUP BY a    UNION ALL
SELECT a,    b,    SUM(c) FROM Input GROUP BY a, b;

But how could this be done without access to the ROLLUP keyword? We an use postgres (or mysql) as the database here, but in your answer just refrain from using the ROLLUP keyword.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃不饱 2025-02-15 01:06:43

您也可以使用 union all s模拟这一点,因为我们有:

GROUP BY ROLLUP(a,b)
--> GROUP BY (), (a), (a,b)

因此,使用 croup(a,b),lollup(x,y)我们将产品乘以乘以:

GROUP BY ROLLUP(a,b), (x,y)
--> GROUP BY (), a, (a,b) *cross product* (), x, (x,y)
--> (),() + (),x + (),x,y + a,() + a,x + a,x,y + a,b,(), a,b,x, a,b,x,y

因此,将其应用于原始问题:

WITH sales (Year, Half, Category, Product, Revenue) AS (
SELECT 2020,    'H1',   'Electronics',  'Phone',    200 UNION ALL
SELECT 2020,    'H1',   'Electronics',  'Computer', 300 UNION ALL
SELECT 2020,    'H2',   'Electronics',  'Phone',    100 UNION ALL
SELECT 2020,    'H2',   'Electronics',  'Computer', 175 UNION ALL
SELECT 2021,    'H1',   'Electronics',  'Phone',    109 UNION ALL
SELECT 2021,    'H1',   'Electronics',  'Computer', 32  UNION ALL
SELECT 2021,    'H2',   'Electronics',  'Phone',    93  UNION ALL
SELECT 2021,    'H2',   'Electronics',  'Computer', 111
)


SELECT SUM(Revenue) AS "sum", NULL AS category, NULL AS product, NULL AS year, NULL AS half FROM Sales GROUP BY (),() UNION ALL
SELECT SUM(Revenue), NULL, NULL, Year, NULL FROM Sales GROUP BY (),Year UNION ALL
SELECT SUM(Revenue), NULL, NULL, Year, Half FROM Sales GROUP BY (),Year,Half UNION ALL
SELECT SUM(Revenue), Category, NULL, NULL, NULL FROM Sales GROUP BY Category,() UNION ALL
SELECT SUM(Revenue), Category, NULL, Year, NULL FROM Sales GROUP BY Category,Year UNION ALL
SELECT SUM(Revenue), Category, NULL, Year, Half FROM Sales GROUP BY Category,Year,half UNION ALL
SELECT SUM(Revenue), Category, Product, NULL, NULL FROM Sales GROUP BY Category,Product,() UNION ALL
SELECT SUM(Revenue), Category, Product, Year, NULL FROM Sales GROUP BY Category,Product,Year UNION ALL
SELECT SUM(Revenue), Category, Product, Year, half FROM Sales GROUP BY Category,Product,Year,Half

You can emulate this also with UNION ALLs since we have:

GROUP BY ROLLUP(a,b)
--> GROUP BY (), (a), (a,b)

So with ROLLUP(a,b), ROLLUP(x,y) we multiply the products together so we get:

GROUP BY ROLLUP(a,b), (x,y)
--> GROUP BY (), a, (a,b) *cross product* (), x, (x,y)
--> (),() + (),x + (),x,y + a,() + a,x + a,x,y + a,b,(), a,b,x, a,b,x,y

So applying it to the original question we would have:

WITH sales (Year, Half, Category, Product, Revenue) AS (
SELECT 2020,    'H1',   'Electronics',  'Phone',    200 UNION ALL
SELECT 2020,    'H1',   'Electronics',  'Computer', 300 UNION ALL
SELECT 2020,    'H2',   'Electronics',  'Phone',    100 UNION ALL
SELECT 2020,    'H2',   'Electronics',  'Computer', 175 UNION ALL
SELECT 2021,    'H1',   'Electronics',  'Phone',    109 UNION ALL
SELECT 2021,    'H1',   'Electronics',  'Computer', 32  UNION ALL
SELECT 2021,    'H2',   'Electronics',  'Phone',    93  UNION ALL
SELECT 2021,    'H2',   'Electronics',  'Computer', 111
)


SELECT SUM(Revenue) AS "sum", NULL AS category, NULL AS product, NULL AS year, NULL AS half FROM Sales GROUP BY (),() UNION ALL
SELECT SUM(Revenue), NULL, NULL, Year, NULL FROM Sales GROUP BY (),Year UNION ALL
SELECT SUM(Revenue), NULL, NULL, Year, Half FROM Sales GROUP BY (),Year,Half UNION ALL
SELECT SUM(Revenue), Category, NULL, NULL, NULL FROM Sales GROUP BY Category,() UNION ALL
SELECT SUM(Revenue), Category, NULL, Year, NULL FROM Sales GROUP BY Category,Year UNION ALL
SELECT SUM(Revenue), Category, NULL, Year, Half FROM Sales GROUP BY Category,Year,half UNION ALL
SELECT SUM(Revenue), Category, Product, NULL, NULL FROM Sales GROUP BY Category,Product,() UNION ALL
SELECT SUM(Revenue), Category, Product, Year, NULL FROM Sales GROUP BY Category,Product,Year UNION ALL
SELECT SUM(Revenue), Category, Product, Year, half FROM Sales GROUP BY Category,Product,Year,Half

https://dbfiddle.uk/?rdbms=postgres_14&fiddle=be3b0d89ad97eaf44b522caf0df9d7da

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文