SQL: Select combinatie

Status
Niet open voor verdere reacties.

ddaemen

Gebruiker
Lid geworden
30 jun 2007
Berichten
48
Beste,

Ik begin met een voorbeeld:

ID | Artikelgroep
------------------
1 | CARG
1 | CEMV
2 | CECS
2 | COIF
2 | CARG

Wat ik dus wil is een querie die cijfer 1 geeft als ik CARG + CEMV selecteer, niks terug geeft als ik CARG + CEMV + CMAX selecteer omdat dit volgens de tabel niet kan.

Ik heb al where Artikelgroep = 'CARG' OR Artikelgroep = 'CEMV' maar dan krijg ik 1 en 2 terug, 1 klopt omdat daar CARG en CEMV in staat dus die wil ik ook zien, maar 2 wil ik niet zien omdat daar geen CEMV in staat (maar die krijg ik wel omdat er CARG in staat).
 
Laatst bewerkt:
uhm dan kun je toch "AND" gebruiken? Maar mogelijk interpreteer ik je vraag verkeerd
 
Dat kan niet :) want als je AND gebruikt tussen 2 dezelfde kolommen krijg je altijd niks terug.
 
Dat is waar, natuurlijk.

Ik denk dat ik zelf meer aan een subselect zat te denken of een view, maar nu ik er langer over nadenk is dat wel moeilijk algemeen te maken.
 
Ik had zelf al zoiets:

SELECT DISTINCT ID FROM HLITMP_TBLOAE WHERE ARTIKELGROEP = 'CARG' AND ID IN (
SELECT DISTINCT ID FROM HLITMP_TBLOAE WHERE ARTIKELGROEP = 'CEMV'
)

Maar dat werkt alleen voor 2 artikelgroepen, maar kan ook bijvoorbeeld 5 zijn.
 
Laatst bewerkt:
Daar zat ik ook aan te denken, het wordt snel een niet algemene oplossing. Het is een beetje afhankelijk van je invoer:

SELECT ID FROM (SELECT `ID`,COUNT(*) AS aantal FROM `ID` WHERE `Artikelgroep` in('CARG','CEMV') group by ID) as temp where aantal = 2

dit werkt zo lang als je weet hoeveel aantal moet zijn
 
Inderdaad,

Ik had ook al iets soort gelijks gevonden (want de query werd weer gevoerd vanuit een andere query):

SELECT ID
FROM HLITMP_TBLOAE
WHERE ARTIKELGROEP IN (SELECT DISTINCT ARTIKELGROEP FROM TBLCRS INNER JOIN TBLART ON TBLCRS.ARTIKELNUMMER = TBLART.ARTIKELNUMMER WHERE CROSSNUMMER = '1141598')
GROUP BY ID
HAVING COUNT(*) = (SELECT COUNT(DISTINCT ARTIKELGROEP) FROM TBLCRS INNER JOIN TBLART ON TBLCRS.ARTIKELNUMMER = TBLART.ARTIKELNUMMER WHERE CROSSNUMMER = '1141598')

even makkelijk gemaakt:

SELECT ID
FROM HLITMP_TBLOAE
WHERE ARTIKELGROEP IN ('CARG', 'CEMV')
GROUP BY ID
HAVING COUNT(*) = 2
 
Ik heb dit project een half jaar laten liggen, maar nu weer opgestart en dit is de definitieve oplossing (als het goed is :P):

[SQL]DECLARE @CROSSNUMMER NVARCHAR(30)
DECLARE @ARTIKELGROEP NVARCHAR(4)
DECLARE @GROUPID INT
DECLARE @ID INT
DECLARE @MAXID INT

SELECT @MAXID = MAX(GROUPID) FROM HLITMP_TBLOAE
SET @ID = 1

IF OBJECT_ID('tempdb..#HLITMP_GROUP') IS NOT NULL
BEGIN
DROP TABLE #HLITMP_GROUP
END

CREATE TABLE #HLITMP_GROUP (
CROSSNUMMER NVARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
ARTIKELGROEP NVARCHAR(4) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
GROUPID INT NOT NULL
)

WHILE @ID <= @MAXID
BEGIN
INSERT INTO #HLITMP_GROUP
SELECT DISTINCT CROSSNUMMER, TBLART.ARTIKELGROEP, HLITMP_TBLOAE.GROUPID
FROM TBLCRS
INNER JOIN TBLART ON TBLART.ARTIKELNUMMER = TBLCRS.ARTIKELNUMMER
INNER JOIN HLITMP_TBLOAE ON TBLART.ARTIKELGROEP = HLITMP_TBLOAE.ARTIKELGROEP
WHERE HLITMP_TBLOAE.GROUPID = @ID AND (CROSSNUMMER + CAST(@ID AS VARCHAR) IN (
SELECT CROSSNUMMER + CAST(GROUPID AS VARCHAR) FROM #HLITMP_GROUP
) OR CROSSNUMMER NOT IN (
SELECT CROSSNUMMER FROM #HLITMP_GROUP
)) AND CROSSNUMMER + TBLART.ARTIKELGROEP NOT IN (
SELECT CROSSNUMMER + ARTIKELGROEP FROM #HLITMP_GROUP
) AND CROSSNUMMER IN (
SELECT DISTINCT CROSSNUMMER
FROM TBLCRS
INNER JOIN TBLART ON TBLART.ARTIKELNUMMER = TBLCRS.ARTIKELNUMMER
INNER JOIN HLITMP_TBLOAE ON TBLART.ARTIKELGROEP = HLITMP_TBLOAE.ARTIKELGROEP
WHERE GROUPID = @ID
GROUP BY CROSSNUMMER
HAVING COUNT(HLITMP_TBLOAE.GROUPID) > 1
)
SET @ID = @ID + 1
END

SELECT DISTINCT * FROM #HLITMP_GROUP

IF OBJECT_ID('tempdb..#HLITMP_GROUP') IS NOT NULL
BEGIN
DROP TABLE #HLITMP_GROUP
END[/SQL]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan