通过总结一些列来组合多行

时间:2016-05-31 22:01:23

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

我的表中有以下数据:

+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+
| 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 |  |
+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+

我想要一个特定产品的单行,其QuantityTotalPrice被添加到一起,给出以下预期输出:

+-------------+---------------+--------+----------+------------+----------+---------+-------------------------+------------+-----------+--+
| 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行,但没有将QuantityTotalPrice相加。请告诉我怎么做?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

...because they have no common ancestor. Does the constraint reference items in different view hierarchies? That's illegal.' 中有太多列。我建议:

  • GROUP BY
  • OrderID
  • OrderDate

此信息似乎不是您的目标所必需的:

OrderTotal

答案 2 :(得分:1)

每行中包含不同值的列,例如OrderIDOrderDate,查看您的预期结果集我可以假设您想要最早的记录,只需使用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]