SQL Server中此查询的分组依据和总和

时间:2016-08-05 13:15:25

标签: sql sql-server

我希望按if (preg_match_all('/([^{]++)({([^{}]++|(\?R2))*})/', $code, $items, PREG_SET_ORDER)) { // split declarations OrderNumberProductConveyanceID对以下查询进行分组,但我想检索所有这些列,最后Trip

所以像这样的例子

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

enter image description here

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以执行的一个选项是在这些字段上使用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