【问题标题】:SQL query to pivot a column using CASE WHEN使用 CASE WHEN 对列进行透视的 SQL 查询
【发布时间】:2011-05-01 02:28:52
【问题描述】:

我有下表:

Bank:
name  val   amount
John   1     2000
Peter  1     1999
Peter  2     1854
John   2     1888

我正在尝试编写一个 SQL 查询来给出以下结果:

name  amountVal1 amountVal2  
John    2000        1888   
Peter   1999        1854    

到目前为止,我有这个:

SELECT name,
CASE WHEN val = 1 THEN amount ELSE 0 END AS amountVal1,
CASE WHEN val = 2 THEN amount ELSE 0 END AS amountVal2
FROM bank

但是,它给出了稍微错误的结果:

name  amountVal1 amountVal2  
John    2000        0
Peter   1999        0
John    0          1888   
Peter   0          1854    

如何修改我的查询以提供正确的显示? 谢谢

【问题讨论】:

    标签: sql pivot


    【解决方案1】:
    SELECT 
      name,
      SUM(CASE WHEN val = 1 THEN amount ELSE 0 END) AS amountVal1,
      SUM(CASE WHEN val = 2 THEN amount ELSE 0 END) AS amountVal2
    FROM bank GROUP BY name
    

    【讨论】:

    • 成功了。我尝试在没有 SUM 的情况下使用 Group by,但它不起作用。我现在看到您可以使用相同的名称,但在 amountVal1/2 列下有许多不同的值。因此,我假设group by name 不知道如何处理这些数字。在这种情况下,我们需要告诉它对它们求和!感谢您的帮助
    【解决方案2】:

    看起来您需要自己加入表格。试试这个:

    select bank1.name, bank1.amount, bank2.amount
    from bank bank1
    inner join bank bank2 on 
        bank1.name = bank2.name 
        and bank1.val = 1 
        and bank2.val = 2
    

    【讨论】:

    • 谢谢,我认为这也可以,但如果可能的话,我不想创建临时表。
    • @Roger:这不会创建任何临时表。在某些情况下,它甚至可能比 GROUP BY - CASE 方法更快。
    • 但如果有人的行仅针对val=1val=2,则会显示不同的结果。或者多行具有相同的值。
    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2017-12-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多