2013-07-23 4 views
1

Это ошибка, которую я получаю для этого кода SQL. Я не знаю, как лучше всего это исправить.Не содержится в функции GROUP BY или Aggregate Ошибка 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 
+0

Где Group By статьи? – CristisS

+0

Теперь, когда я добавил группу По моей сумме все испортилось. Я тестировал SUM (woeid.h_ListPrice) - SUM (woeid.DiscountAmt) как «Int P & A Charge», выполняя запрос SELECT SUM (h_ListPrice) - SUM (DiscountAmt) FROM WorkOrderEventItemDetail WHERE WorkOrderCode = '12002'. Я хочу, чтобы он возвращал эту информацию для каждого WorkOrderCode. Как мне это сделать? – Vap0r

ответ

6

Вы можете использовать только агрегатную функцию SUM с другими областями, когда у вас есть условие GROUP BY в запросе

+0

У меня проблемы, когда я добавляю GROUP BY. Дополнительная информация в моем комментарии к оригинальному сообщению. – Vap0r

+0

Было бы очень полезно, если бы вы могли опубликовать схему для двух таблиц. По внешнему виду, mui действительно не нужно агрегировать - почему бы не просто «woeid.h_ListPrice - woeid.DisCountAmt AS 'Int P & A Charge»?? Что вы суммируете? Есть ли несколько MajorUnitOrders для каждого транспортного средства? – Curt

+0

Нет, для каждого majorunitorder есть несколько workordereventitemdetails. Я буду использовать псевдонимы для описания отношений. Muo: v: vd: wo все от 1 до 1. v подключается к wo через VIN транспортного средства. Теперь WorkOrderCode в wo может ссылка на многие записи woeid.У меня есть эти записи, чтобы сумма h_ListPrice была суммирована, а затем сумма всех вычитаемых из нее скидов. Надеюсь, это объяснит это достаточно хорошо. – Vap0r

1

Если вы собираетесь включить агрегатные функции в вашем отборном заявлении, то вам необходимо сделать убедитесь, что все неагрегатные функции включены в оператор GROUP BY.

В этом случае вам необходимо добавить предложение GROUP BY, которое включает в себя каждую отдельную строку, за исключением «Int P & A Charge» и «Int Work Charge», поскольку они используют функцию совокупности SUM().

0

Поскольку в запросе используется суммарный SUM, вам нужно добавить предложение GROUP BY, чтобы сообщить движку SQL, как следует суммировать результаты. Например, моделью, дилером и т. Д. По сути, отсутствует предложение GROUP BY.

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

Спасибо, TransferredPDIPartsCost и LaborCost также должны быть объявлены индивидуально, но кроме этого это место. Действительно ли это лучший способ сделать это? Кажется, это чрезмерное. – Vap0r

+0

Wait neve rmind, теперь, когда я добавил группу по моим суммам, не выходит правильно. Я пробовал запрос индивидуально, и он работал, мне просто нужно было указать WHERE WorkOrderCode = VALUE. Есть ли способ сделать это? Может быть, я не понимаю, как работает СУММ. – Vap0r

+0

Множество вопросов - так это все индивидуальные ответы: 1) Каждый раз, когда вы объединяете (например, используете такие функции, как SUM, MIN, MAX и т. Д.), Вы должны * использовать 'GROUP BY'. 2) Не уверен, что вы подразумеваете, попробовав запрос индивидуально ... 3) Что касается предложения WHERE - да, вы можете его использовать. 4) Вы можете включить 'WorkOrderCode' в ваш SELECT & GROUP BY или просто в GROUP BY - в любом случае. – Chains

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

Спасибо, Курт! Действительно ценю это. Если бы вы могли объяснить, почему вы сделали то, что сделали, это было бы здорово. Если я правильно понимаю, вы делаете JOIN подзапроса, чтобы обойти проблемы агрегирования, которые у меня были? Я не понимаю, что делает COALESCE, но это просто обеспечивает защиту от значений NULL? Аккуратный код, хотя, отлично работает! – Vap0r

+1

Да: Я выполняю агрегацию значений в подзапросе, где его можно оптимизировать (и SQL становится чище). COALESCE - это потому, что подзапросы «OUTER JOIN'ed», и если они в конечном итоге содержат значение NULL, они «загрязнят» ваши вычисления, превращая их в NULL. – Curt

+0

Эй, Курт, предположим, что я ошибся, и время от времени есть два WorkOrders для того же VIN. Мне нужно суммировать суммы с обеих рабочих мест и вычитать их, чтобы получить общую сумму в этом случае. Какой был бы лучший способ сделать это? Другой подзапрос? – Vap0r

0

Одним из решений может быть, что вместо столбца, вы можете использовать подзапрос для извлечения значения из таблицы на основе текущего ключа в JOIN, в этом случае вы можете не помещать эти столбцы в GROUP BY.

0

Если применить агрегатные функции на некоторых столбцах списка выберите столбцы, то вы должны использовать группу по п столбцов, которые не применяются на агрегатные функции

 
Example 
Right Query :-- 
Select dept_id,sum(sal) from employee group by dept_id 

Wrong Query :- 
Select dept_id,sum(sal) from employee 
Смежные вопросы