【问题标题】:How can I remove duplicates in SQL and SUM a field for each instance of duplication?如何删除 SQL 中的重复项并对每个重复实例的字段求和?
【发布时间】:2014-07-15 19:10:54
【问题描述】:

我在 SQL 中有一个表格,其中列出了发票的详细信息。

每张发票可以有多个项目。例如,在下表中,您可以看到多个“轮渡服务”行。这是因为只有一张发票,但该发票上有五个项目(所有项目的金额不同),因此“轮渡服务”被列出了五次。另一方面,顶行“Tank Liner”在发票上只有一个项目,因此只出现一次。

我希望能够仅列出每个描述一次(删除重复项)但是,我希望“金额”字段显示所有金额的总和。我怎样才能做到这一点?

+--------------------------------+--------------------------------+----------+----+--------------+--------+-----------+
| Description                    | LineDescription                | Amount   | UM | UnitCost     | Units  | GrossAmt  |
+--------------------------------+--------------------------------+----------+----+--------------+--------+-----------+
| Tank Liner                     | 3 FBE Bolted Steel Circular L  | 18035.13 | EA | 327911.30000 | 1.000  | 327911.30 |
| Delivery Tanks to Site         | Bolted Steel Liner Tank        | 8184.92  | EA | 148816.76000 | 1.000  | 148816.76 |
| Circular Tanks                 | Circular Tank (Inv 4556)       | 5689.78  | EA | 103450.66000 | 1.000  | 103450.66 |
| Fit Ext Nut Caps to Tank 2     | Fit External Nut Caps to Tank  | 2141.93  | EA | 1947.21000   | 1.000  | 1947.21   |
| Replace Platform on Tank 3     | Replace Platform on Tank 3 --  | 43356.50 | EA | 39415.00000  | 1.000  | 39415.00  |
| Retention held Inv 1758        | Road Furniture and Street Sign | 7621.22  | LS | 0.00000      | 0.000  | 11138.00  |
| ferry service                  | Fares to QIR                   | -50.00   | EA | 45.45400     | -1.000 | -45.45    |
| ferry service                  | Fares to QIR                   | -699.00  | EA | 635.45400    | -1.000 | -635.45   |
| ferry service                  | Fares to QIR                   | 69.99    | EA | 63.64000     | 1.000  | 63.64     |
| ferry service                  | Fares to QIR                   | -60.01   | EA | 54.54500     | -1.000 | -54.55    |
| ferry service                  | Fares to QIR                   | 275.00   | EA | 250.00000    | 1.000  | 250.00    |
| Rentry of invoice 104759A      | Tank 2 - 2.5ML                 | 95039.64 | EA | 103450.60000 | 1.000  | 103450.60 |
| Rentry of invoice 104759A      | Tank 2 - 2.5ML                 | 20631.62 | EA | 103450.60000 | 1.000  | 103450.60 |
| Rent8-10Rooksby;21&15Morgan    | 8-10 Rooksby W/shop office May | 1560.63  | LS | 0.00000      | 0.000  | 1418.75   |
| Rent8-10Rooksby;21&15Morgan    | 15 Morgan St Fabrication May14 | 2079.18  | LS | 0.00000      | 0.000  | 1890.16   |
| Credit J.Wagner wrong sizeBoot | JOE WAGNER-CREDIT WRONG SIZE B | -127.60  | EA | 116.00000    | -1.000 | -116.00   |
| Pipe Raiser and Freight        | Supply 65 x 600mm Gal Pipe Ris | 114.40   | EA | 52.00000     | 2.000  | 104.00    |
| Pipe Raiser and Freight        | Freight                        | 22.00    | EA | 20.00000     | 1.000  | 20.00     |
| Phil Mansfield - Uniforms      | PHIL MANSFIELD-JEANS SZ 77R    | 92.40    | EA | 28.00000     | 3.000  | 84.00     |
| traffic management             | Traffic Controllers x 3, vehi  | 1162.43  | EA | 1056.75000   | 1.000  | 1056.75   |
| Belts                          | 11A1030 Gates Belts            | 24.64    | EA | 11.20000     | 2.000  | 22.40     |
| Relay, Tubing, Buzzer, Cable T | CPX4150 Service Valve Core Hig | 36.52    | EA | 33.20000     | 1.000  | 33.20     |
| Relay, Tubing, Buzzer, Cable T | ACX5018BL Warning Buzzer 24V 7 | 11.28    | EA | 10.25000     | 1.000  | 10.25     |
| Relay, Tubing, Buzzer, Cable T | ACX1294 Heat Shrink D/Wall Bla | 12.10    | EA | 11.00000     | 1.000  | 11.00     |
+--------------------------------+--------------------------------+----------+----+--------------+--------+-----------+

例如,而不是这个:

+---------------+-----------------+---------+
| Description   | LineDescription | Amount  |
+---------------+-----------------+---------+
| ferry service | Fares to QIR    | -50.00  |
| ferry service | Fares to QIR    | -699.00 |
| ferry service | Fares to QIR    | 69.99   |
| ferry service | Fares to QIR    | -60.01  |
| ferry service | Fares to QIR    | 275.00  |
+---------------+-----------------+---------+

我想看看这个:

+---------------+-----------------+---------+
| Description   | LineDescription | Amount  |
+---------------+-----------------+---------+
| ferry service | Fares to QIR    | -464.02 |
+---------------+-----------------+---------+

仅供参考,这是我的查询:

select Description, LineDescription, Amount, UM, UnitCost, Units, GrossAmt, from brvAPAllInvoices 
Where PaidDate is null and APCo = 1 and Type = 'P'

【问题讨论】:

    标签: sql sum duplicates


    【解决方案1】:

    您想要的是使用group by 的基本聚合,但挑战是LineDescription。对于您的示例,它们都是相同的。对于其他人来说,他们是不同的。这是您可以做的一件事:

    select description, min(LineDescription) as LineDescription, sum(Amount) as Amount
    from table t
    group by description;
    

    编辑:

    您需要对不在group by 中的所有列使用聚合函数。以下是我对可能对您有帮助的最佳猜测:

    select Description, min(LineDescription), sum(Amount), min(UM), avg(UnitCost),
           sum(Units), sum(GrossAmt)
    from brvAPAllInvoices 
    Where PaidDate is null and APCo = 1 and Type = 'P'
    group by Description;
    

    【讨论】:

    • 这会产生一条错误消息:Msg 8120, Level 16, State 1, Line 1 列 'brvAPAllInvoices.DueDate' 在选择列表中无效,因为它不包含在聚合函数或 GROUP 中BY 子句。
    • @user3674701 。 . .该列既不在您的样本数据中,也不在您想要的结果中。
    【解决方案2】:

    这就是GROUP BY 的用途。你需要GROUP BYDescriptionLineDescription列:

    SELECT Description, LineDescription, SUM(Amount) AS Amount
    FROM Table1
    GROUP BY Description, LineDescription
    

    请注意,这将为DescriptionLineDescription 的每个组合 生成不同的输出行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 2013-07-02
      • 2019-03-22
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多