2016-08-31 4 views
1

Я использую SQL Server 2012.делает SUM С ПОМОЩЬЮ GroupBy

У меня ниже данные, где продукты А, В, С и D являются компонентами «ABCD» в BundleID. Я делаю сумму цены, делая группу BundleID. Проблема здесь в том, что я хочу, чтобы она выбрасывала ошибку и не делала сумму в случае, если цена продукта равна 0. Может кто-то предложить вам выход.

Можем ли мы заменить 0's evrywhere на какое-то фиктивное значение, чтобы произвести ошибку при выполнении суммы?

BundleID Product Price 
ABCD  A   5 
ABCD  B   10 
ABCD  C   0 
ABCD  D   20 
EFGH  E   50 
EFGH  F   100 
EFGH  G   50 
EFGH  H   10 


WITH BUNDLE_SUM AS (
select S.BundleID, 
     SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM 
     from PM_SCOPE S 
     JOIN PM_LOOKUP_VALUE LV ON LV.SCOPE_ID = S.SCOPE_ID 
     WHERE LD.LOOkUP_NAME = 'Bundle Details' 
     GROUP BY S.BundleID 
) 

Спасибо.

+0

Почему бы не просто исключить те, у кого «цена равна 0»? – Squirrel

+0

Почему вы не добавляете другое условие в предложение where, например WHERE AND LD.Price> 0? –

+0

- это LV.VALUE_0 то же поле цены, определенное в ваших данных образца? что такое тип данных столбца цены? –

ответ

0

Hi просто проверьте наличие нуля в таблице, если да, повышайте ошибку, иначе делайте группу, или что бы вы ни делали хочу сделать. то есть

select S.BundleID, 
     SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM 
     from PM_SCOPE S 
     JOIN PM_LOOKUP_VALUE LV ON LV.SCOPE_ID = S.SCOPE_ID 
     WHERE LD.LOOkUP_NAME = 'Bundle Details' and 
       s BundleID not in (select distinct BundleID from PM_SCOPE S 
      JOIN PM_LOOKUP_VALUE LV ON LV.SCOPE_ID = S.SCOPE_ID and LV.VALUE_0=0 ) 
     GROUP BY S.BundleID 
+0

Я хочу, чтобы мой запрос каким-то образом не вычислил всю стоимость пакета, даже если только один продукт не имеет цены. Таким образом, в моем примере выше цена C равна 0, поэтому цена для bundleID ABCD не должна рассчитываться, однако она должна делать штраф для пакета EFGH. – Newbie

+0

Я попытался сделать следующее, но он дает ошибку для всего запроса. – Newbie

+0

ok в этом случае использовать не в ... я буду обновлять ответ –

0
select bundleid, 
sum(Case when price=0 then 'string' else price end) 
from 
your table 
group by bundleid 

Идея заключается в том string + int преобразование потерпит неудачу, если цена ИНТ ..

0

Вы можете, как показано ниже:

DECLARE @Tbl TABLE (BundleID NVARCHAR(10), Price FLOAT) 
INSERT INTO @Tbl 
VALUES 
('ABCD', 5 ), 
('ABCD', 10), 
('ABCD', 0 ), 
('ABCD', 20), 
('EFGH', 50), 
('EFGH', 100), 
('EFGH', 50), 
('EFGH', 10 ) 


SELECT 
    BundleID, 
    IIF(MIN(Price) = 0, 'INCORRECT', CAST(SUM(Price) AS NVARCHAR(10))) TotalPrice 
FROM 
    @Tbl 
GROUP BY 
    BundleID 

Результат:

BundleID TotalPrice 
ABCD  INCORRECT 
EFGH  210 
Смежные вопросы