Невозможно использовать агрегат или подзапрос - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь сгруппировать это выражение case, но, к сожалению, получаю сообщение об ошибке.

select da.order_id, osl.itemid, sum(case when osl.sku = '00005' then 0 when osl.sku = '00006' then 0 else osl.price * sil.quantity end) merchcost, sum(sil.merchUnitCost * sil.quantity) cogs, sum(sil.quantity) quantity,
    CASE
    WHEN EXISTS (SELECT * FROM fcat.dbo.subscriptionskus a where a.itemId = osl.itemid) then 1
    WHEN EXISTS (SELECT * FROM foam.dbo.subscriptionprogram b where b.orderStateLineId = osl.orderStateLine_id ) then 1
    else 0
    END as isAdmin,

    CASE
    WHEN EXISTS (SELECT * FROM fcat.dbo.subscriptionskus a where a.itemId = osl.itemid) then CAST('subscriptionskus' as varchar(MAX))
    WHEN EXISTS (SELECT * FROM foam.dbo.subscriptionprogram b where b.orderStateLineId = osl.orderStateLine_id ) then CAST('subscriptionprogram' as varchar(MAX))
    else 'NotListed'
    END as SubTable

from #dispatchAmounts da 
inner join orderstates os on os.order_id = da.order_id
inner join orderstatelines osl on osl.orderState_id = os.orderState_id
inner join shippingIntentLines sil on sil.orderStateLine_id = osl.orderStateLine_id and da.shippingIntent_nbr = sil.shippingIntent_nbr
where da.code = 'merch' and sil.quantity > 0
group by da.order_id, osl.itemid, CASE
    WHEN EXISTS (SELECT * FROM fcat.dbo.subscriptionskus a where a.itemId = osl.itemid) then 1
    WHEN EXISTS (SELECT * FROM foam.dbo.subscriptionprogram b where b.orderStateLineId = osl.orderStateLine_id ) then 1
    else 0
    END,CASE
    WHEN EXISTS (SELECT * FROM fcat.dbo.subscriptionskus a where a.itemId = osl.itemid) then CAST('subscriptionskus' as varchar(MAX))
    WHEN EXISTS (SELECT * FROM foam.dbo.subscriptionprogram b where b.orderStateLineId = osl.orderStateLine_id ) then CAST('subscriptionprogram' as varchar(MAX))
    else 'NotListed'
    END

ERROR:

Невозможно использовать агрегат или подзапрос в выражение, используемое для группы по списку в предложении GROUP BY.

Могу ли я как-нибудь сделать эту работу?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

У меня есть пара предложений. Вы используете select * в своих операторах case, но столбцы, на которые ссылается '*', не входят в ваше предложение group by. Добавление их было бы плохим способом решить проблему. Вместо этого используйте 'select 1' и посмотрите, что произойдет.

Вторая рекомендация - просто не использовать when exists, а использовать left join с подзапросами и использовать их в своих case операторах.

0 голосов
/ 11 мая 2020

Так вот что я сделал. 1. Удалено описание Case для группы By. 2. Изменены подзапросы в заявлении дела. Последовал рекомендации @Shiv Sidhu.

Спасибо всем.

...