Sql 如何根据条件分隔和求和2列
我在做一个select语句,我有一个列,我想根据它们的类型分成两列,然后得到按ID分组的金额总和 我想把所有的黄金和白金放在一列,所有的白银和青铜放在第二列,然后根据ID进行汇总和分组,看起来是这样的: 我尝试过这样的结合:Sql 如何根据条件分隔和求和2列,sql,sql-server,Sql,Sql Server,我在做一个select语句,我有一个列,我想根据它们的类型分成两列,然后得到按ID分组的金额总和 我想把所有的黄金和白金放在一列,所有的白银和青铜放在第二列,然后根据ID进行汇总和分组,看起来是这样的: 我尝试过这样的结合: SELECT ID, SUM(Amount) AS "Gold/Platinum", 0 AS "Bronze/Silver" FROM table WHERE Type IN ('gold', 'platinum') G
SELECT
ID,
SUM(Amount) AS "Gold/Platinum",
0 AS "Bronze/Silver"
FROM
table
WHERE
Type IN ('gold', 'platinum')
GROUP BY
ID
UNION ALL
SELECT
ID,
SUM(Amount) AS "Bronze/Silver",
0 AS "Gold/Platinum"
FROM
table
WHERE
Type IN ('bronze', 'silver')
GROUP BY
ID
黄金/白金列是正确的,但我在青铜/白银列中没有得到任何信息使用条件聚合:
select id,
sum(case when Type in ('gold', 'platinum') then amount else 0 end) as gold_platinum,
sum(case when Type in ('bronze', 'silver') then amount else 0 end) as bronze_silver
from t
group by id
order by id;
您可以在SSMS中运行此操作:
DECLARE @data TABLE( [ID] INT, [Type] VARCHAR(10), [Amount] INT );
INSERT INTO @data ( [ID], [Type], [Amount] ) VALUES
( 1, 'gold', 100 )
, ( 1, 'gold', 50 )
, ( 1, 'bronze', 75 )
, ( 2, 'silver', 10 )
, ( 2, 'bronze', 20 )
, ( 3, 'gold', 35 )
, ( 4, 'silver', 20 )
, ( 4, 'platinum', 30 );
SELECT
[ID]
, SUM( CASE WHEN [Type] IN ( 'gold', 'platinum' ) THEN Amount ELSE 0 END ) AS [Gold/Platinum]
, SUM( CASE WHEN [Type] IN ( 'bronze', 'silver' ) THEN Amount ELSE 0 END ) AS [Bronze/Silver]
FROM @data
GROUP BY [ID]
ORDER BY [ID];
返回
+----+---------------+---------------+
| ID | Gold/Platinum | Bronze/Silver |
+----+---------------+---------------+
| 1 | 150 | 75 |
| 2 | 0 | 30 |
| 3 | 35 | 0 |
| 4 | 30 | 20 |
+----+---------------+---------------+
他比我快了几秒钟那就成功了!我想我得去办一个案子,但我无法理解其中的逻辑。这很有道理,谢谢你。