【问题标题】:SQL - conditional "group by"SQL - 有条件的“分组依据”
【发布时间】:2017-09-10 01:55:39
【问题描述】:

我有一张包含客户的表格,他们的账户金额和相应的货币。我需要选择账户中金额最高的 100 个客户,仅考虑 2 种货币(美元和欧元)-> 所有金额都已转换为美元。这是我的表格的摘录:

client |  amount | currency
1      |  100    |  USD
2      |  20     |  HKD
3      |  50     |  EUR
1      |  15     |  EUR

我只对美元和欧元感兴趣,我必须保留每种货币的金额,并根据这两种货币的总金额对客户进行排名。上表所需的输出如下:

client |  amount in USD |  amount in EUR | total value
1      |  100           |  15            | 115
3      |  0             |  50            | 50

任何帮助将不胜感激! 干杯, 拉法

【问题讨论】:

  • 请标记您的 dbms。
  • 这基本上是一个带有WHEREGROUP BY 查询——至少对于total value 列。这是非常基本的 SQL。你试过什么?

标签: sql group-by


【解决方案1】:

假设你的表名是'clients':

    SELECT 
    client, 
    SUM(CASE c.currency WHEN 'USD' THEN c.amount ELSE 0 END) AS amount_in_usd,
    SUM(CASE c.currency WHEN 'EUR' THEN c.amount ELSE 0 END) AS amount_in_eur,
    SUM(amount) AS total_value
    FROM clients AS c
    WHERE c.currency = 'USD' OR c.currency='EUR'
    GROUP BY c.client
    ORDER BY total_value DESC

【讨论】:

    【解决方案2】:

    使用条件聚合(例如在 Sql Server 中):

    select 
        client
      , sum(case when currency = 'USD' then amount else 0 end) as AmountInUSD
      , sum(case when currency = 'EUR' then amount else 0 end) as AmountInEUR
      , sum(case when currency in ('USD','EUR') then amount else 0 end) as TotalValue
    from t
    group by client
    having sum(case when currency in ('USD','EUR') then amount else 0 end) > 0
    order by TotalValue desc
    

    rextester 演示(用于 sql server):http://rextester.com/LJF89562

    返回:

    +--------+-------------+-------------+------------+
    | client | AmountInUSD | AmountInEUR | TotalValue |
    +--------+-------------+-------------+------------+
    |      1 |         100 |          15 |        115 |
    |      3 |           0 |          50 |         50 |
    +--------+-------------+-------------+------------+
    

    【讨论】:

    • @raphael.cardinaux 乐于助人!
    【解决方案3】:

    您可以将CASE 表达式与group by client 一样使用

    sum(case when currency = 'USD' then amount) as amount in USD 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-06
      • 2018-12-20
      • 2018-11-26
      • 2015-12-19
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多