Toon posts:

[SQL] foutmelding bij case

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb dus volgende statement geschreven:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select oh.ORDERH_ORGID
,oh.ORDERH_CUSTREF
,oh.ORDERH_REF
,oh.ORDERH_STATUS
,oh.ORDERH_CREATEDATE
,(select 'Amount' = 
    case convert(nvarchar,od.OD_DISCOUNTTYPE)
    when '%' then convert(nvarchar,sum((od.OD_VALUE * ((od.OD_VATPERC / 100)+1))* (1-(od.OD_DISCOUNT / 100))))
            else convert(nvarchar,sum(od.OD_VALUE * ((od.OD_VATPERC / 100)+1)))
    end
from dbo.ORDERDETAIL od
where od.OD_ORDERHID = oh.ORDERH_ID and od.OD_ISACTIVE = 1) amount
from dbo.ORDERHEADER oh
where oh.orderh_ref like '000000022'


en ik krijg volgende melding:

Msg 8118, Level 16, State 1, Line 1
Column 'od.OD_DISCOUNTTYPE' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

Nu ik dacht eerst dat het misschien niet mogelijk zou zijn om case uit te voeren met strings maar ik heb dan op microsoft help site een sql-stagement gevonden die wel met strings werkte dus daar ligt het probleem niet aan.

Dan had ik gelezen dat alle datatypes gelijk moeten zijn, vandaar dat ik die converts te geprobeerd heb maar ook hier lag het niet aan.

In het SQL boek dat ik heb staat er maar 1 case statement in en dat is met integers + het is een oracle boek en ik werk met MS sql server.

Ik zou echt niet meer weten wat er fout aan is, of waarom discounttype in een aggregate function zou moeten zitten, en het nut van een group by zie ik ook niet echt in. Zit er nu toch wel al een 3 tal uur op te zoeken.

de sql werkte zolang de case er niet inzat.

Ik hoop dat deze topic niet weer gesloten gaat worden om een kant en klaar antwoord te verkrijgen want ik heb er deze keer echt wel op zitten zoeken :(

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:26
De fout zit niet in je CASE, maar -zoals je uit de foutmelding kan afleiden als je deze eens goed leest- in je SUM functie die je aanroept.
Dat is nl. een aggregate functie die dus werkt op een 'set' van gegevens, en jij moet aangeven op welke set deze moet werken (mbhv group by). (Er staat een artikeltje in onze FAQ over hoe GROUP BY nu precies werkt).

Om het op te lossen zal je, volgens mij, in je CASE een correlated subquery moeten maken die de SUM() doet van de gegevens die jij wilt .... (Wat wel een impact zal hebben op performance)

https://fgheysels.github.io/


Verwijderd

Topicstarter
hartelijk bedankt! het werkt.. qua performantie zal het niet zo heel erg zijn want het is om een rapport te genereren dus wordt niet enorm veel opgeroepen

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 19:44
Een voorzetje want zoals hierboven ben je je group by vergeten. Wel even het foutje er uit halen ;)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
select 
    oh.ORDERH_ORGID 
    ,oh.ORDERH_CUSTREF 
    ,oh.ORDERH_REF 
    ,oh.ORDERH_STATUS 
    ,oh.ORDERH_CREATEDATE 
    ,(  select 'Amount' =  
            case convert(nvarchar,od.OD_DISCOUNTTYPE) 
                when '%' then convert(nvarchar,sum((od.OD_VALUE * ((od.OD_VATPERC / 100)+1))* (1-(od.OD_DISCOUNT / 100)))) 
                    else convert(nvarchar,sum(od.OD_VALUE * ((od.OD_VATPERC / 100)+1))) 
            end 
        from dbo.ORDERDETAIL od 
        where od.OD_ORDERHID = oh.ORDERH_ID and od.OD_ISACTIVE = 1
        group by case convert(nvarchar. od.OD_DISCOUNTTYPE) 
) amount 
from dbo.ORDERHEADER oh 
where oh.orderh_ref like '000000022'