Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据条件分隔和求和2列_Sql_Sql Server - Fatal编程技术网

Sql 如何根据条件分隔和求和2列

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分组的金额总和

我想把所有的黄金和白金放在一列,所有的白银和青铜放在第二列,然后根据ID进行汇总和分组,看起来是这样的:

我尝试过这样的结合:

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 |
+----+---------------+---------------+

他比我快了几秒钟那就成功了!我想我得去办一个案子,但我无法理解其中的逻辑。这很有道理,谢谢你。