MSSQL Group by并从分组中选择行
我想知道我想做的事是否可行。我希望按业务日期和id对记录进行分组,然后按id进行分组,并为一个字段选择一个日期,为另一个字段选择另一个日期,而不是对一个表进行多个查询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
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;
然而,一些人已经测试了性能,发现预聚合可以提高性能。您可以添加一些样本数据,其中包含它们的预期输出吗?请添加样本数据和预期结果。看起来不难,但你的解释还不够清楚。