sql - MSSQL Group by 和 Select rows from grouping
问题描述
我试图弄清楚我想做的事情是否可行。我不想在一个表上使用多个查询,而是想按业务日期和 id 对记录进行分组,然后按 id 分组,并为一个字段选择一个日期,为另一个字段选择另一个日期。
SELECT
*
{AMOUNT FROM DATE}
{AMOUNT FROM OTHER DATE}
FROM (
SELECT
date,
id,
SUM(amount) AS amount
FROM
table
GROUP BY id, date
AS subquery
GROUP BY id
解决方案
您似乎正在寻找进行数据透视查询。我通常为此使用交叉表。根据您发布的查询,它可能如下所示:
SELECT
id,
SUM(CASE WHEN date = '20190901' THEN amount ELSE 0 END) AmountFromSept01,
SUM(CASE WHEN date = '20191001' THEN amount ELSE 0 END) AmountFromOct01
FROM (
SELECT
date,
id,
SUM(amount) AS amount
FROM
table
GROUP BY id, date
)AS subquery
GROUP BY id;
您也可以使用 CTE。
WITH CTE AS(
SELECT
date,
id,
SUM(amount) AS amount
FROM
table
GROUP BY id, date
)
SELECT
id,
SUM(CASE WHEN date = '20190901' THEN amount ELSE 0 END) AmountFromSept01,
SUM(CASE WHEN date = '20191001' THEN amount ELSE 0 END) AmountFromOct01
FROM CTE
GROUP BY id;
甚至是叛逆者,直接进行操作。
SELECT
id,
SUM(CASE WHEN date = '20190901' THEN amount ELSE 0 END) AmountFromSept01,
SUM(CASE WHEN date = '20191001' THEN amount ELSE 0 END) AmountFromOct01
FROM CTE
GROUP BY id;
但是,有些人对性能进行了测试,发现预聚合可以提高性能。
推荐阅读
- go - 位操作golang
- tensorflow - 需要更好地理解 Keras-Model 调用方法的训练参数
- mysql - Is it normal to perform INNER and LEFT JOIN with 4 tables?
- node.js - 在 Electron 应用中使用 socket.io P2P 共享文件
- swift - 无法从 json 响应创建字符串 SwiftUI 列表
- database - 尝试在 linux mint 中安装 oracle xe 18c 但出现错误。有什么建议么?
- reactjs - 在 TextArea 问题中反应计数单词
- python - 询问有关优化 while 循环的建议
- python - Pyplot 结合两个子图轴
- python - 无需回退(搜索) io.Bytes() 对象即可使用 docx add_picture 包含图像