首页 > 解决方案 > 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

标签: sqlsql-server

解决方案


您似乎正在寻找进行数据透视查询。我通常为此使用交叉表。根据您发布的查询,它可能如下所示:

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;

但是,有些人对性能进行了测试,发现预聚合可以提高性能。


推荐阅读