【问题标题】:Group By and Sum for this query in SQL ServerSQL Server 中此查询的 Group By 和 Sum
【发布时间】:2016-08-05 13:15:25
【问题描述】:

我想为下面的查询按OrderNumberProductConveyanceIDTrip 分组,但我想检索所有这些列,最后是sum(Volume)

举个例子

SELECT 
    OD.[Customer]
    ,OD.[OrderNumber] 'Order#'
    ,OD.[Shipper]
    ,OD.[Product]
    ,OD.[Dock] 'Dock/Track'
    ,OD.[Lines] 'Berth/Position'
    ,[TAMS].[fnc_GetDelayCountByOrderNumber](OD.OrderNumber) 'Delays' 
    ,OD.[ScheduledArrival] 'Sched .Arrival'
    ,OD.ActiveCheckPointStatus 'Active CheckPoint'
    ,OD.[CheckPointStatus] 'CheckPoint Status'
    ,OD.[ContractNumber]
    ,OD.[Direction]
    ,SUM(OD.[Volume]) 'Volume'
    ,OD.[PreviousCheckPointStatus]
    ,OD.[CheckPointType]
    ,OD.[SourceContainer]
    ,OD.[DestinationContainer]
    ,OD.[UnitsOfMeasure]
    ,OD.ConveyanceID
    ,OD.TripId
    ,OD.NumberOfConveyance
FROM 
    TAMS.OrderDetail OD
WHERE 
    OrderNumber = 8394
GROUP BY 
    PRODUCT, Ordernumber, ConveyanceID, TripID

我该怎么做?

SELECT 
    OD.[Customer]
    ,OD.[OrderNumber] 'Order#'
    ,OD.[Shipper]
    ,OD.[Product]
    ,OD.[Dock] 'Dock/Track'
    ,OD.[Lines] 'Berth/Position'
    ,[TAMS].[fnc_GetDelayCountByOrderNumber](OD.OrderNumber) 'Delays' 
    ,OD.[ScheduledArrival] 'Sched .Arrival'
    ,OD.ActiveCheckPointStatus 'Active CheckPoint'
    ,OD.[CheckPointStatus] 'CheckPoint Status'
    ,OD.[ContractNumber]
    ,OD.[Direction]
    ,OD.[Volume]
    ,OD.[PreviousCheckPointStatus]
    ,OD.[CheckPointType]
    ,OD.[SourceContainer]
    ,OD.[DestinationContainer]
    ,OD.[UnitsOfMeasure]
    ,OD.ConveyanceID
    ,OD.TripId
    ,OD.NumberOfConveyance
FROM 
    TAMS.OrderDetail OD
WHERE  
    OrderNumber = 8394

【问题讨论】:

  • 如果您想按这四列分组,那么您需要选择所有其他列吗?
  • 是的,我想为这四列分组并选择所有其他列
  • 如果不在 group by 中的其他列之一具有不同的值会发生什么?因此,例如,如果我们有一个 id 为 1 的用户。我们按此分组。但是可以说我们正在保存用户的操作。如果我们按用户 ID 分组,那么不同的操作会发生什么?您也需要按此分组。这有意义还是我应该举一个更好的例子?关键是,你不能显示不在 groupby 中的东西是有原因的。如果您可以在不使用额外列的情况下摆脱困境,那么解决方案非常简单。
  • 没关系。我想检索 Product、OrderNumber、ConveyanceID、TripID 数据相同的所有记录
  • @user1030181 请显示示例预期结果。用文字描述你想要什么只会导致混乱和沮丧。

标签: sql sql-server


【解决方案1】:

你不能。查询中的每一列都必须在 GROUP BY 或聚合函数中。

【讨论】:

    【解决方案2】:

    您可以做的一个选择是在这些字段上使用SUM()OVER() PARTITION

    SELECT  DISTINCT
            OD.[Customer]
            ,OD.[OrderNumber] 'Order#'
            ,OD.[Shipper]
            ,OD.[Product]
            ,OD.[Dock] 'Dock/Track'
            ,OD.[Lines] 'Berth/Position'
            ,[TAMS].[fnc_GetDelayCountByOrderNumber](OD.OrderNumber) 'Delays' 
            ,OD.[ScheduledArrival] 'Sched .Arrival'
            ,OD.ActiveCheckPointStatus 'Active CheckPoint'
            ,OD.[CheckPointStatus] 'CheckPoint Status'
            ,OD.[ContractNumber]
            ,OD.[Direction]
            ,OD.[Volume]
            ,OD.[PreviousCheckPointStatus]
            ,OD.[CheckPointType]
            ,OD.[SourceContainer]
            ,OD.[DestinationContainer]
            ,OD.[UnitsOfMeasure]
            ,OD.ConveyanceID
            ,OD.TripId
            ,OD.NumberOfConveyance
            ,SUM(OD.Volume) OVER (PARTITION BY OrderNumber, Product, ConveyanceID, Trip) As SumOfVolume
    FROM    TAMS.OrderDetail OD
    WHERE   OrderNumber= 8394
    

    这样做的注意事项是,SUM() 值将出现在每条记录上。

    但是,如果您不需要额外的字段,您可以简单地这样做:

    SELECT  OrderNumber 'Order#',
            Product, 
            ConveyanceID,
            Trip,
            SUM(Volume) As SumOfVolume
    FROM    TAMS.OrderDetail OD
    WHERE   OrderNumber= 8394
    GROUP BY OrderNumber, Product, ConveyanceID, Trip
    

    【讨论】:

    • 我想对整个查询进行分组并找到总和
    • 在上面的查询中,你只是为卷列做它不起作用
    • @user1030181 怎么不工作?我已经更新了答案,添加了一个没有附加字段的备用查询。
    • 你不理解我的问题我想获取所有其他列,但要与这些列进行分组OrderNumber, Product, ConveyanceID, Trip
    • @user1030181 我明白 - 我不明白第一个解决方案如何对你“不起作用”。
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 2014-05-06
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2014-12-28
    • 2020-01-19
    相关资源
    最近更新 更多