25. januar 2010 - 13:10
Der er
5 kommentarer og
1 løsning
Hjælp til select med case
Hej,
Jeg har denne select som henter data fra to tabeller:
StrSQL="SELECT TISFC001.pdno, TISFC001.ItemID, tbl_FQCprodukter.InspekLevel " &_
"FROM TISFC001 " &_
"LEFT OUTER JOIN tbl_FQCprodukter tbl_FQCprodukter ON tbl_FQCprodukter.VareNr=TISFC001.ItemID " &_
"WHERE TISFC001.apdt='01-01-1900' "
Feltet tbl_FQCprodukter.InspekLevel indeholder værdierne A, B eller C
Feltet TISFC001.pdno indeholder unikke værdier
Feltet TISFC001.ItemID indeholder dubletter
Jeg ønsker at afgrænse resultatet, således at jeg får alle linier når tbl_FQCprodukter.InspekLevel = A eller B, men kun én linie per ItemID (feltet TISFC001.ItemID) når tbl_FQCprodukter.InspekLevel = C
Kan det ikke laves med en case?
25. januar 2010 - 19:08
#4
Hvorfor ikke indrette din query saaledes at du med det samme faar de linier ud du skal bruge og saa vise dem paa siden? Det synes mig enklere end at querye saa du faar for mange linier og saa bagefter sortere dem ud paa siden.
Jeg kender ikke din SQL dialekt - jeg har lavet en query der virker i MySql; jeg haaber du selv kan omsaette det i din dialekt. Din problemstilling var ikke helt klar for mig, saa jeg har lavet de foelgende antagelser:
(1) For hver ItemID kan der eksistere adskillige pdno'er.
(2) Naar InspLevel er A eller B vil du for hver ItemID have samtlige pdno'er, men naar InspLevel er C vil du have antallet af pdno'er.
Min query er derfor en UNION query der foerst soeger efter alle linier hvor InspLevel er A eller B og derefter soeger for antallet af linier hvor InspLevel er C.
For at teste det lavede jeg to tabeller, denisTISFC001 og denistbl_FQCprodukter. Jeg fyldte et par vaerdier i.
Her kommer foerst min query, og derefter kommer mine tabeller og vaerdierne.
SELECT pdno, ItemID, InspLevel
FROM denisTISFC001
LEFT JOIN denistbl_FQCproducter ON ItemID = VareNr
WHERE aptd='1900-01-01' AND InspLevel = 'A' OR InspLevel = 'B'
UNION
SELECT COUNT(*), ItemID, InspLevel
FROM denisTISFC001
LEFT JOIN denistbl_FQCproducter ON ItemID = VareNr
WHERE aptd='1900-01-01' AND InspLevel = 'C'
GROUP BY InspLevel
Resultatet er, med de givne tabeller og vaerdier, det foelgende:
pdno ItemID InspLevel
1 1 A
1 1 B
2 1 A
2 1 B
3 1 A
3 1 B
1 2 B
2 2 B
3 2 B
4 2 B
7 2 C
Og her er tabeller og vaerdier:
CREATE TABLE denisTISFC001(pdno INT, ItemID INT, aptd DATE);
CREATE TABLE denistbl_FQCproducter(VareNr INT, InspLevel CHAR(1));
INSERT INTO denisTISFC001 VALUES(1, 1, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(2, 1, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(3, 1, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(1, 2, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(2, 2, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(3, 2, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(1, 2, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(2, 2, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(3, 2, '1900-01-01');
INSERT INTO denisTISFC001 VALUES(4, 2, '1900-01-01');
INSERT INTO denistbl_FQCproducter VALUES(1, 'A');
INSERT INTO denistbl_FQCproducter VALUES(2, 'B');
INSERT INTO denistbl_FQCproducter VALUES(1, 'B');
INSERT INTO denistbl_FQCproducter VALUES(2, 'C');