SQL 2 regels niet tonen, 1 voldoet niet aan eisen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • JohanLi
  • Registratie: April 2022
  • Laatst online: 10-02-2023
Goedemorgen,

Ik heb drie orders/batches van elk twee regels. Dit ligt op een locatie in het magazijn. Het niveau bepaalt de hoogte, we hebben trucks die gaan maar "tot 6 hoog". Via een query wil ik de juiste volledige orders hiervoor tonen.

Hieronder zie je drie voorbeelden. Alleen 2602182 zou ik willen zien. De moeilijkheid (voor mij) zit hem in batch 2602017. Die heeft één hoge en één lage locatie. Die wil ik dus ook niet zien. Hoe sluit ik de bovenste twee batches uit, maar niet de onderste?

Ik ben al bezig geweest met Exists, Excepts, diverse Cases, maar ik krijg het helaas (nog niet) voor elkaar.


Afbeeldingslocatie: https://tweakers.net/i/S1LYq-waXBa27BNKJGPg41kGp84=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/Esgb9fBYvqTBfbdba58wg28K.png?f=user_large

Beste antwoord (via JohanLi op 26-04-2022 09:31)


  • dev10
  • Registratie: April 2005
  • Laatst online: 15:28
Dus iets als:

code:
1
2
3
select * from table_name where batch_no not in (
  select distinct batch_no from table_name where niveau > 6
)


Dit is wel de quick en dirty variant, maar dit schud ik zo even uit m'n losse pols.

[ Voor 25% gewijzigd door dev10 op 26-04-2022 09:21 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Kheos
  • Registratie: Juni 2011
  • Nu online

Kheos

FP ProMod
Dus je wil maximaal 6 hoog? Waarom doe je dan niet '... and niveau<=6'? Afhankelijk van hoe je de rest opbouwt kan dit in de 'where' of de 'having' staan. Of begrijp ik je vraag niet?

Acties:
  • 0 Henk 'm!

  • dogtagz
  • Registratie: December 2014
  • Laatst online: 13-05 07:28
Ik begrijp niet precies wat je nou wilt zien. Je wilt batch 2602182 zien. Maar op basis van welke eis?
Geef je de batchnummer als input, en wil je dan selecteren op lager dan 6?
Dan is t iets als
code:
1
2
3
Select BATCH NO
FROM <db>
WHERE niveau < 6;

$ alias cd='rm -rf'


Acties:
  • +1 Henk 'm!

  • erwn
  • Registratie: November 2020
  • Niet online
Kheos schreef op dinsdag 26 april 2022 @ 09:10:
Dus je wil maximaal 6 hoog? Waarom doe je dan niet '... and niveau<=6'? Afhankelijk van hoe je de rest opbouwt kan dit in de 'where' of de 'having' staan. Of begrijp ik je vraag niet?
Ik denk dat je dan inderdaad een group by query zoekt met een having max(niveau) < 6. Of eventueel een subquery in je where clause à la where not exists (select * from ... where batchId = batchId and niveau >= 6).

Acties:
  • 0 Henk 'm!

  • thunder7
  • Registratie: Januari 2003
  • Laatst online: 08:17

thunder7

houten vaas/schaal nodig?

Hoe heet het aggregaat van die 2 regels? Je zoekt zo'n aggregaat/ding, waarbij voor alle regels geldt dat niveau <= 6, toch?

hout-nerd - www.hetmooistehout.nl of www.houtenschalen.nl


Acties:
  • 0 Henk 'm!

  • JohanLi
  • Registratie: April 2022
  • Laatst online: 10-02-2023
Ik wil inderdaad maximaal 6 hoog, maar ook alleen volledige orders. In dit voorbeeld heeft Batch NO 2602017 één hoge en één lage locatie, waardoor ik die batch in zijn geheel niet wil zien.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 15:28
Dus iets als:

code:
1
2
3
select * from table_name where batch_no not in (
  select distinct batch_no from table_name where niveau > 6
)


Dit is wel de quick en dirty variant, maar dit schud ik zo even uit m'n losse pols.

[ Voor 25% gewijzigd door dev10 op 26-04-2022 09:21 ]


Acties:
  • 0 Henk 'm!

  • JohanLi
  • Registratie: April 2022
  • Laatst online: 10-02-2023
dev10 schreef op dinsdag 26 april 2022 @ 09:19:
Dus iets als:

code:
1
2
3
select * from table_name where batch_no not in (
  select distinct batch_no from table_name where niveau > 6
)


Dit is wel de quick en dirty variant, maar dit schud ik zo even uit m'n losse pols.
Quick en Dirty, maar wel gelukt!

Ik had nog niet eerder met een subquery in de query gewerkt.

Dank allemaal voor de reacties!

Acties:
  • 0 Henk 'm!

  • luukvr
  • Registratie: Juni 2011
  • Niet online
Zou ook zonder subquery kunnen (batch_no's die geen geen hoger dan 6 niveau delen bevat):

code:
1
2
3
4
SELECT a.*
FROM table_name a
LEFT JOIN table_name b ON a.batch_no=b.batch_no AND b.niveau>6
WHERE a.niveau<7 AND b.batch_no IS NULL;


PS. niet getest en misschien niet echt sneller

Maar als je batch_no's wil die in totaal lager dan 7 zijn:

code:
1
2
3
4
SELECT batch_no
FROM table_name
GROUP BY batch_no
HAVING SUM(niveau)<7;


daar zou je SUM kunnen vervangen voor MAX

[ Voor 39% gewijzigd door luukvr op 26-04-2022 14:32 ]

Pagina: 1