【问题标题】:Combine multiple rows by summing up some of its columns通过汇总其中的一些列来组合多行
【发布时间】:2016-09-30 02:16:07
【问题描述】:

我的表中有以下数据:

+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+
| ProductName | PricePerPiece | CafeID | Quantity | TotalPrice | MemberID | OrderID |        OrderDate        | OrderTotal | ProductID |  |
+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+
| Coffee      |            10 |      1 |        1 |         10 |       20 |    1008 | 2016-06-01 02:38:47.113 |        196 |         1 |  |
| Mocha       |           152 |      1 |        1 |        152 |       20 |    1008 | 2016-06-01 02:38:47.113 |        196 |         4 |  |
| Pikachu     |            34 |      1 |        1 |         34 |       20 |    1008 | 2016-06-01 02:38:47.113 |        196 |         5 |  |
| Coffee      |            10 |      1 |        1 |         10 |       20 |    1009 | 2016-06-01 02:39:49.750 |         35 |         1 |  |
| Cappucino   |            25 |      1 |        1 |         25 |       20 |    1009 | 2016-06-01 02:39:49.750 |         35 |         3 |  |
+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+

我想要一个特定产品的单行,其中将其 Quantity 和 TotalPrice 添加在一起,得到以下预期输出:

+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+
| ProductName | PricePerPiece | CafeID | Quantity | TotalPrice | MemberID | OrderID |        OrderDate        | OrderTotal | ProductID |  |
+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+
| Coffee      |            10 |      1 |        2 |         20 |       20 |    1008 | 2016-06-01 02:38:47.113 |        196 |         1 |  |
| Mocha       |           152 |      1 |        1 |        152 |       20 |    1008 | 2016-06-01 02:38:47.113 |        196 |         4 |  |
| Pikachu     |            34 |      1 |        1 |         34 |       20 |    1008 | 2016-06-01 02:38:47.113 |        196 |         5 |  |
| Cappucino   |            25 |      1 |        1 |         25 |       20 |    1009 | 2016-06-01 02:39:49.750 |         35 |         3 |  |
+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+

我尝试了以下查询:

SELECT [ProductName], [PricePerPiece], [CafeID],
    SUM([Quantity]) AS [Quantity], SUM([TotalPrice]) AS [TotalPrice],
    [MemberID],[OrderID],[OrderDate],[OrderTotal],[ProductID]
    FROM [ProductOrders] GROUP BY [ProductID], [ProductName], [PricePerPiece], [CafeID], [MemberID], [OrderID], [OrderDate], [OrderTotal]

但它给出了相同的结果,只是将Coffee 行显示在一起,但没有将其Quantity 和TotalPrice 相加。请告诉我该怎么做?

【问题讨论】:

  • SUM(VALUE1 + VALUE2) 在 [sql-server] 中无效吗?

标签: sql sql-server database sql-server-2012 group-by


【解决方案1】:

每行中具有不同值的列,例如 OrderID、OrderDate ,查看您的预期结果集我可以假设您想要最早的记录,只需对它们的列使用 MIN 函数。

此外,只有在 select 中且未包含在任何聚合函数中的列必须在 group by 子句中,您将获得您想要的结果。

SELECT [ProductName]
     , [PricePerPiece]
     , [CafeID]
     , SUM([Quantity])   AS [Quantity]
     , SUM([TotalPrice]) AS [TotalPrice]
     , [MemberID]
     , MIN([OrderID])    AS [OrderID]
     , MIN([OrderDate])  AS [OrderDate]
     , [OrderTotal]
     , [ProductID]
FROM [ProductOrders] 
GROUP BY [ProductName]
     , [PricePerPiece]
     , [CafeID]
     , [MemberID]
     , [OrderTotal]
     , [ProductID]

【讨论】:

  • 谢谢 M.Ali。我不知道Group 子句。非常感谢您的信息。 :)
【解决方案2】:

GROUP BY 中的列过多。我建议:

  • OrderID
  • OrderDate
  • OrderTotal

您的目标似乎不需要此信息:

SELECT [ProductName], [PricePerPiece], [CafeID],
       SUM([Quantity]) AS [Quantity], SUM([TotalPrice]) AS [TotalPrice],
       [MemberID], [ProductID]
FROM [ProductOrders]
GROUP BY [ProductID], [ProductName], [PricePerPiece], [CafeID], [MemberID];

【讨论】:

    【解决方案3】:

    OrderTotal 的每个 Coffee 行都有不同的值。您可以选择不选择OrderTotal,也可以选择SUM(OrderTotal)。

    您选择但不求和(或以其他方式聚合)的任何不同值都不会组合在一起。

    仔细观察:OrderDate 和 OrderID 也是如此。根据您的预期输出,您要选择MIN(OrderID), MIN(OrderDate), MAX(OrderTotal)

    【讨论】:

    • 谢谢亚伦。我使用了SUM(OrderTotal),它解决了这个问题。 :)
    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2020-03-16
    相关资源
    最近更新 更多