1

这就是我得到的这个 SQL 代码的错误。我不知道修复它的最佳方法。

SELECT
    muo.VehicleReferenceCode as REF#,
    CONVERT(CHAR(10), muo.ActualDeliveryDate, 101) as 'Date In',
    vd.Model as Model,
    muo.DealerCategoryCode as 'Cat.',
    v.PurchaseSourceVendorCode as Vendor,
    muo.VendorCost + muo.FactoryOptionsCost as 'VEH Cost',
    muo.FreightCostAmt as Freight,
    muo.TransferredPDIPartsCost + muo.TransferredPDILaborCost as 'Trans Cost',
    SUM(woeid.h_ListPrice) - SUM(woeid.DiscountAmt) as 'Int P&A Charge',
    SUM(woeld.RegularLaborAmt) - SUM(woeld.DiscountAmt) as 'Int Labor Charge',
    muo.VendorCost 
      + muo.FactoryOptionsCost 
      + muo.FreightCostAmt 
      + muo.TransferredPDIPartsCost 
      + muo.TransferredPDILaborCost 
      + SUM(woeid.h_ListPrice) 
      - SUM(woeid.DiscountAmt) 
      + SUM(woeld.RegularLaborAmt) 
      - SUM(woeld.DiscountAmt)                 as 'VEH Total'
FROM MajorUnitOrder muo 
     INNER JOIN Vehicle v
        ON muo.VehicleIdentificationNum = v.VehicleIdentificationNum 
     JOIN VehicleDesignator vd
       ON v.VehicleDesignatorCode = vd.VehicleDesignatorCode 
     JOIN WorkOrder wo
       ON v.VehicleIdentificationNum = wo.VehicleIdentificationNum 
     JOIN WorkOrderEventItemDetail woeid
       ON wo.WorkOrderCode = woeid.WorkOrderCode 
     JOIN WorkOrderEventLaborDetail woeld
       ON woeid.WorkOrderCode = woeld.WorkOrderCode
4

7 回答 7

6

SUM当您的查询中有GROUP BY子句时,您只能将聚合函数与其他字段一起使用

于 2013-07-23T20:37:31.253 回答
1

这是您可以处理查询的另一种方法:

SELECT
    muo.VehicleReferenceCode                     AS REF#,
    CONVERT(CHAR(10), muo.ActualDeliveryDate, 101) AS 'Date In',
    vd.Model                                     AS Model,
    muo.DealerCategoryCode                       AS 'Cat.',
    v.PurchaseSourceVendorCode                   AS Vendor,
    muo.VendorCost + muo.FactoryOptionsCost      AS 'VEH Cost',
    muo.FreightCostAmt                           AS Freight,
    muo.TransferredPDIPartsCost 
      + muo.TransferredPDILaborCost              AS 'Trans Cost',
    COALESCE(ORDR.ListPriceSum, 0.0) 
        - COALESCE(ORDR.DiscountAmtSum, 0.0)     AS 'Int P&A Charge',
    COALESCE(LABOR.LaborAmtSum, 0.0)
        - COALESCE(LABOR.LaborDiscountSum, 0.0)  AS 'Int Labor Charge',
    muo.VendorCost 
      + muo.FactoryOptionsCost 
      + muo.FreightCostAmt 
      + muo.TransferredPDIPartsCost 
      + muo.TransferredPDILaborCost 
      + COALESCE(ORDR.ListPriceSum, 0.0)
      - COALESCE(ORDR.DiscountAmtSum, 0.0)
      + COALESCE(LABOR.LaborAmtSum, 0.0)
      - COALESCE(LABOR.LaborDiscountSum, 0.0)    AS 'VEH Total'
FROM MajorUnitOrder muo 
     INNER JOIN Vehicle v
        ON muo.VehicleIdentificationNum = v.VehicleIdentificationNum 
     JOIN VehicleDesignator vd
       ON v.VehicleDesignatorCode = vd.VehicleDesignatorCode 
     JOIN WorkOrder wo
       ON v.VehicleIdentificationNum = wo.VehicleIdentificationNum 
     LEFT JOIN 
     (
         SELECT WorkOrderCode
                SUM(h_ListPrice    AS ListPriceSum,
                SUM(DiscountAmt)   AS DiscountAmtSum,
           FROM WorkOrderEventItemDetail
                GROUP BY WorkOrderCode
     ) ORDR
       ON ORDR.WorkOrderCode = wo.WorkOrderCode
     LEFT JOIN
     (
         SELECT WorkOrderCode,
                SUM(RegularLaborAmt) AS LaborAmtSum,
                SUM(DiscountAmt)     AS LaborDiscountSum
           FROM WorkOrderEventLaborDetail
                GROUP BY WorkOrderCode
     ) LABOR
       ON LABOR.WorkOrderCode = wo.WorkOrderCode
于 2013-07-24T15:19:35.420 回答
1

如果要在 select 语句中包含聚合函数,则需要确保所有非聚合函数都包含在 GROUP BY 语句中。

在这种情况下,您需要添加一个 GROUP BY 子句,其中包括除“Int P&A Charge”和“Int Labor Charge”之外的每一行,因为它们使用聚合 SUM() 函数。

于 2013-07-23T20:38:53.247 回答
0

一种解决方案可以是列,您可以使用子查询根据 JOIN 中的当前键从表中获取值,在这种情况下,您可以避免将这些列放在 GROUP BY 中。

于 2013-07-25T09:34:15.413 回答
0

如果您在选择列列表的某些列上应用聚合函数,那么您应该对聚合函数未应用的列使用 group by 子句

例子
正确查询:--
通过 dept_id 从员工组中选择 dept_id,sum(sal)

错误查询:-
从员工中选择 dept_id,sum(sal)
于 2013-07-25T09:43:46.670 回答
0
SELECT
    muo.VehicleReferenceCode as REF#,
    CONVERT(CHAR(10), muo.ActualDeliveryDate, 101) as 'Date In',
    vd.Model as Model,
    muo.DealerCategoryCode as 'Cat.',
    v.PurchaseSourceVendorCode as Vendor,
    muo.VendorCost + muo.FactoryOptionsCost as 'VEH Cost',
    muo.FreightCostAmt as Freight,
    muo.TransferredPDIPartsCost + muo.TransferredPDILaborCost as 'Trans Cost',
    SUM(woeid.h_ListPrice) - SUM(woeid.DiscountAmt) as 'Int P&A Charge',
    SUM(woeld.RegularLaborAmt) - SUM(woeld.DiscountAmt) as 'Int Labor Charge',
    muo.VendorCost + muo.FactoryOptionsCost + muo.FreightCostAmt + muo.TransferredPDIPartsCost + muo.TransferredPDILaborCost + SUM(woeid.h_ListPrice) - SUM(woeid.DiscountAmt) + SUM(woeld.RegularLaborAmt) - SUM(woeld.DiscountAmt) as 'VEH Total'
FROM MajorUnitOrder muo INNER JOIN Vehicle v
    ON muo.VehicleIdentificationNum = v.VehicleIdentificationNum JOIN VehicleDesignator vd
    ON v.VehicleDesignatorCode = vd.VehicleDesignatorCode JOIN WorkOrder wo
    ON v.VehicleIdentificationNum = wo.VehicleIdentificationNum JOIN WorkOrderEventItemDetail woeid
    ON wo.WorkOrderCode = woeid.WorkOrderCode JOIN WorkOrderEventLaborDetail woeld
    ON woeid.WorkOrderCode = woeld.WorkOrderCode
GROUP BY
    muo.VehicleReferenceCode,
    CONVERT(CHAR(10), muo.ActualDeliveryDate, 101),
    vd.Model,
    muo.DealerCategoryCode,
    v.PurchaseSourceVendorCode,
    muo.VendorCost + muo.FactoryOptionsCost,
    muo.FreightCostAmt,
    muo.TransferredPDIPartsCost + muo.TransferredPDILaborCost
于 2013-07-23T20:42:34.803 回答
0

由于查询中使用了聚合 SUM,因此您需要添加一个 GROUP BY 子句来告诉 SQL 引擎应该如何对结果求和。例如模型、经销商等。本质上它缺少 GROUP BY 子句。

于 2013-07-23T20:39:09.167 回答