Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MSSQL 2008] If else statement in WHERE

Pagina: 1
Acties:

  • richardboer
  • Registratie: December 2005
  • Laatst online: 21-11 08:55
Wij hier op kantoor gebruik een rapportage tool genaamd Targit om bepaalde rapporten uit het systeem te halen. Alleen lopen we door wat aanpassingen in ons ERP pakket tegen wat problemen aan.

De MSSQL server haalt via een SSIS pakket gegevens op van een IBM AS/400, vervolgens kan Targit op basis van SQL views uit deze database gegevens halen en rapportages maken.

Nu ons probleem: Wij hebben een database met artikelen, waarin ook de artikel prijzen staan.
Alleen maken wij ook gebruik van meerdere magazijnen. (i.v.m. diepvries, vers, etc)

CONO60PNUM60STRC60SCSU60
2120030200
2120030012.25
2158025010
2158025204.
2120035010
2120035202.25


Voorbeeldje van een paar producten in de database.

Dan nu wat ik niet voor elkaar krijg:
Als de prijs (SCSU60) bij magazijn (STRC60) 01 op 0 staat dat hij dan de prijs uit Magazijn (STRC60) 20 haalt.
(Mag 1 is vers, mag 20 diepvries)

We gebruikten tot voor kort alleen magazijn 01 voor al onze prijzen, alleen door wat veranderingen van bovenaf is besloten om vers en diepvries qua prijzen op de diverse magazijnen te boeken. (Ja ik weet het, zoiets hoor je normaal in een betere tabel te zetten maar ja: meer dan 13k+ producten welke over deze 2 magazijnen verspreid zijn naar een andere tabel zetten is ook zeer tricky + moet op een AS/400 gebeuren)

De query waar ik de gegevens mee op haal:
code:
1
2
3
USE DATAWAREHOUSE; 
go
SELECT CONO60, PNUM60, STRC60, SCSU60 FROM INP60 WHERE CONO60 = '21' AND STRC60 = '01';

Deze word nu nog min of meer gebruikt (zit compleet verweven in een SQL view welke deze tabel via een JOIN binnen haalt en alleen de prijs eruit haalt op basis van PNUM60 -> productID, CONO60 -> CompanyNumber, STRC60 -> Magazijn)

Wat zelf al gedaan:
e.e.a. al geprobeerd m.b.t. CASE, IF ELSE
Maar denk dat ik ergens een denkfout ofzo maak

Mijn simpele CASE was bijvoorbeeld:
code:
1
2
3
4
5
6
SELECT CONO60, PNUM60, STRC60, SCSU60 FROM INP60 WHERE
CASE SCSU60 
WHEN '0' THEN STRC60 = '01' 
ELSE STRC60 = '20' 
end  
ORDER BY SCSU60;

Richard


  • Kips
  • Registratie: Januari 2005
  • Laatst online: 13:29
(jarig!)
richardboer schreef op donderdag 15 augustus 2013 @ 13:08:

code:
1
2
3
4
SELECT CONO60, PNUM60, IIF(STRC60 = '0','01','20'), SCSU60 
FROM INP60 
WHERE
ORDER BY SCSU60;
Als je wilt dat je STRC60 indien '0' '01' wordt en anders '20' zou bovenstaand moeten werken...

Volgens mij kan je in de where geen select case gebruiken.

edit: maar bij nader inzien bedoel je dat niet...

Je wilt wanneer SCSU60 = 0 filteren op "STRC60 = '01' en anders op "STRC60 = '20', toch? Kan je dan niet beter een UNION gebruiken? Iets als:

SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT CONO60, PNUM60, STRC60, SCSU60 
FROM INP60 
WHERE (SCSU60 = '0' AND STRC60 = '01')

UNION

SELECT CONO60, PNUM60, STRC60, SCSU60 
FROM INP60 
WHERE (SCSU60 <> '0' AND STRC60 = '20')

ORDER BY SCSU60;

[ Voor 35% gewijzigd door Kips op 15-08-2013 13:21 ]


Verwijderd

Probeer dit eens....

SELECT
INP60.CON060
,INP60.PNUM60
,CASE
WHEN INP60.SCSU60 = 0 THEN Mag20.STRC60
ELSE INP60.STRC60
END [STRC60]
,CASE
WHEN INP60.SCSU60 = 0 THEN Mag20.SCSU60
ELSE INP60.SCSU60
END [SCSU60]
FROM
INP60
LEFT JOIN INP60 Mag20 -- Haal ook data voor Magazijn 20 op via left join
ON Mag20.PNUM60 = INP60.PNUM60 -- Ik neem aan dat dit je key is.
AND Mag20.STRC60 = '20'
WHERE
INP60.STRC60 = '01' -- BasisMagazijn 01

  • richardboer
  • Registratie: December 2005
  • Laatst online: 21-11 08:55
Verwijderd schreef op donderdag 15 augustus 2013 @ 13:17:
Probeer dit eens....

SELECT
INP60.CON060
,INP60.PNUM60
,CASE
WHEN INP60.SCSU60 = 0 THEN Mag20.STRC60
ELSE INP60.STRC60
END [STRC60]
,CASE
WHEN INP60.SCSU60 = 0 THEN Mag20.SCSU60
ELSE INP60.SCSU60
END [SCSU60]
FROM
INP60
LEFT JOIN INP60 Mag20 -- Haal ook data voor Magazijn 20 op via left join
ON Mag20.PNUM60 = INP60.PNUM60 -- Ik neem aan dat dit je key is.
AND Mag20.STRC60 = '20'
WHERE
INP60.STRC60 = '01' -- BasisMagazijn 01
Dit lijkt aardig in de buurt te komen ja.

Klopt PNUM60 is de key

Ga er is even weer verder mee stoeien :)


@Kips
Ja wil filteren op de prijs.
Maar gezien de standaard prijs voor de meeste (nu nog 90 - 95% van de producten) uit
magazijn 01 komen.
Is dit dus de basis voor het filter, als dus in Magazijn 01 een 0 prijs staat, moet hij het uit Magazijn 20 gaan halen.

Ga ook eventjes naar jou query kijken met de UNION

[ Voor 17% gewijzigd door richardboer op 15-08-2013 13:32 ]

Richard