MSSQL Group by并从分组中选择行

MSSQL Group by并从分组中选择行,sql,sql-server,Sql,Sql Server,我想知道我想做的事是否可行。我希望按业务日期和id对记录进行分组,然后按id进行分组,并为一个字段选择一个日期,为另一个字段选择另一个日期,而不是对一个表进行多个查询 SELECT * {AMOUNT FROM DATE} {AMOUNT FROM OTHER DATE} FROM ( SELECT date, id, SUM(amount) AS amount FROM table

我想知道我想做的事是否可行。我希望按业务日期和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,
            date1 = sum(iif(date = '2000-01-01', amount, null)),
            date2 = sum(iif(date = '2000-01-02', amount, null))
from        [table]
group by    id 

看起来您正在寻找一个pivot查询。我通常使用交叉标签。根据您发布的查询,它可能看起来像:

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;

然而,一些人已经测试了性能,发现预聚合可以提高性能。

您可以添加一些样本数据,其中包含它们的预期输出吗?请添加样本数据和预期结果。看起来不难,但你的解释还不够清楚。