【问题标题】:SQL Group By and sum of other columnSQL Group By 和其他列的总和
【发布时间】:2019-09-12 10:30:11
【问题描述】:

以下是原始表

+--------------+---------------+----------+---------+-----------+
| CustomerName | InvoiceNumber | ItemRate | TaxRate | TaxAmount |
+--------------+---------------+----------+---------+-----------+
| A            |             1 |      500 | 4%      | 20        |
| B            |             2 |      300 | 9%      | 27        |
| B            |             2 |      100 | 9%      | 9         |
| B            |             2 |      400 | 4%      | 16        |
| C            |             3 |      250 | 9%      | 22.5      |
| C            |             3 |      650 | 4%      | 26        |
| D            |             4 |      200 | 4%      | 8         |
| D            |             4 |      100 | 4%      | 4         |
+--------------+---------------+----------+---------+-----------+

我想要这样的输出:

+--------------+---------------+--------------+---------+-----------+
| CustomerName | InvoiceNumber | InvoiceTotal | TaxRate | TaxAmount |
+--------------+---------------+--------------+---------+-----------+
| A            |             1 |          500 | 4%      | 20        |
| B            |             2 |          800 | 9%      | 36        |
| B            |             2 |          800 | 4%      | 16        |
| C            |             3 |          900 | 9%      | 22.5      |
| C            |             3 |          900 | 4%      | 26        |
| D            |             4 |          300 | 4%      | 12        |
+--------------+---------------+--------------+---------+-----------+

在进行 Group By 时,我遇到了发票价值总和的问题。 我必须使用“TaxRate”进行分组以组合类似的税收,并且我想在结果中包含新列,显示该特定发票的总计。

发票总计列应该包含整个发票的总和,因为我当前的查询是按税组而不是整个发票求和。

我的查询是:

Select CustomerName, InvoiceNumber, sum(itemrate) as InvoiceTotal, TaxRate, sum(TaxAmount) 
from salestable group by customername,invoicenumber, Taxrate

请帮助解决这个问题。

谢谢

【问题讨论】:

  • 能否请您提供您的尝试?当我们没有您的 SQL 时,我们很难告诉您哪里出错了。
  • 我更新了我的问题,请参阅问题中的“我的查询是:”部分。

标签: sql sql-server


【解决方案1】:

如果我理解正确,您想在每个客户的发票上加上 itemrate

select CustomerName, InvoiceNumber,
       sum(sum(itemrate)) over (partition by CustomerName, InvoiceNumber) as InvoiceTotal,
       TaxRate,
       sum(TaxAmount) as TaxAmount
from salestable
group by customername, invoicenumber, Taxrate

【讨论】:

    【解决方案2】:

    试试这个-

    WITH CTE AS
    (
        SELECT CustomerName,SUM(ItemRate)  InvoiceTotal
        FROM your_table
        GROUP BY CustomerName
    )
    
    SELECT A.CustomerName,A.InvoiceNumber,B.InvoiceTotal,A.TaxRate,SUM(A.TaxAmount)
    FROM your_table A
    LEFT JOIN CTE B ON A.CustomerName = B.CustomerName
    GROUP BY A.CustomerName,A.InvoiceNumber,B.InvoiceTotal,A.TaxRate
    ORDER BY A.CustomerName,A.TaxRate DESC
    

    【讨论】:

    • DV 几乎在我发布之前 ;)
    • 为什么?这有效(尽管TaxRate 是相反的顺序)
    • ORDER BY 已添加 :) @Martin
    【解决方案3】:

    类似:

    SELECT  tab.CustomerName,
            tab.InvoiceNumber,
            it.InvoiceTotal,
            tab.TaxRate,
            SUM(tab.TaxAmount) AS TaxAmount
      FROM tab
        INNER JOIN (
                    SELECT InvoiceNumber, SUM(ItemRate) AS InvoiceTotal FROM tab GROUP BY InvoiceNumber
                   ) it ON it.InvoiceNumber = tab.InvoiceNumber
      GROUP BY tab.CustomerName, tab.InvoiceNumber, it.InvoiceTotal, tab.TaxRate
      ORDER BY tab.CustomerName, tab.TaxRate DESC
    

    查看关联的fiddle

    结果:

    A   1   500 4   20
    B   2   800 9   36
    B   2   800 4   16
    C   3   900 9   22.5
    C   3   900 4   26
    D   4   300 4   12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2016-02-09
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多