2017-05-11 8 views
1

Ich muss eine Prozedur erstellen, die eine Tabelle am Ende zurückgibt, die eine Liste der Felder enthält, in denen bestimmte Substanzen angewendet wurden. Ich muss für jedes Feld und die verwendete Substanz eine Zeile zurückgeben. Dies funktioniert gut für alle Felder, in denen tatsächlich etwas angewendet wurde, aber ich muss auch die gleiche Anzahl von Zeilen für diese Felder anzeigen, wenn nichts angewendet wurde.TSQL: Wie zwei Zeilen zurückgegeben werden, wenn Spalte = Null

Im Moment bekomme ich eine Tabelle wie folgt aus:

Field 1 | Substance 1 | 12345 kg 
Field 1 | Substance 2 | 23423 kg 
Field 2 | Substance 1 | 23236 kg 
Field 2 | Substance 2 | 12312 kg 
Field 3 | NULL  | NULL 

Ich weiß, dass ich, indem sie eine Case-Zustand, aber ich brauche zwei Reihen (einer für den NULL-Wert mit mindestens einer Substanz tauschen könnte Substanz 1 und eine für Substanz 2), die die Namen jeder Substanz enthält.

Gibt es eine Möglichkeit, dies zu erreichen?

+1

Es wäre nützlich, also sehen Sie, was Sie versucht haben. Mit welchen Teilen hast du Probleme? Was ist die erwartete Ausgabe? – Arion

+1

Was ist Ihr Eingabe-Dataset und was ist Ihre erwartete Ausgabe? –

+1

Ich weiß nicht, was Ihre Abfrage ist, aber ich denke, Sie müssen LEFT JOIN verwenden. – DarioN1

Antwort

0

Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstanden habe, aber versuchen Sie dies:

CREATE TABLE SourceData (
    FieldName VARCHAR(50), 
    Substance VARCHAR(50), 
    Quantity INT 
) 

INSERT INTO dbo.SourceData (FieldName, Substance, Quantity) VALUES 
('Field 1', 'Substance 1', 12345), 
('Field 1', 'Substance 2', 23423), 
('Field 2', 'Substance 1', 23236), 
('Field 2', 'Substance 2', 12312), 
('Field 3', NULL, NULL) 

SELECT FieldName, Substance, Quantity 
FROM dbo.SourceData WHERE Substance IS NOT NULL 
UNION ALL 
SELECT s1.FieldName, x.Substance, NULL AS Quantity 
FROM dbo.SourceData s1 CROSS JOIN (
    SELECT DISTINCT s2.Substance 
    FROM dbo.SourceData s2 
    WHERE s2.Substance IS NOT NULL 
) x 
WHERE s1.Substance IS NULL 
1

Vielleicht haben Sie so etwas wie dieses:

CREATE TABLE Fields (
    FieldID INT PRIMARY KEY, 
    FieldName VARCHAR(50) NOT NULL UNIQUE, 
) 

INSERT INTO dbo.Fields (FieldID, FieldName) VALUES 
(1, 'Field 1'), 
(2, 'Field 2'), 
(3, 'Field 3') 

CREATE TABLE dbo.Substances (
    SubstanceID INT PRIMARY KEY, 
    Substance VARCHAR(50) NOT NULL UNIQUE 
) 

INSERT INTO dbo.Substances (SubstanceID, Substance) VALUES 
(1, 'Substance 1'), 
(2, 'Substance 2') 

CREATE TABLE AppliedSubstances (
    FieldID INT NOT NULL REFERENCES dbo.Fields, 
    SubstanceID INT NOT NULL REFERENCES dbo.Substances, 
    Quantity INT NOT NULL 
) 

INSERT INTO dbo.AppliedSubstances (FieldID, SubstanceID, Quantity) VALUES 
(1, 1, 12345), 
(1, 2, 23423), 
(2, 1, 23236), 
(2, 2, 12312) 

Dann können Sie die folgende Abfrage verwenden:

SELECT f.FieldName, s.Substance, a.Quantity 
FROM dbo.AppliedSubstances a 
INNER JOIN dbo.Fields f ON f.FieldID = a.FieldID 
INNER JOIN dbo.Substances s ON s.SubstanceID = a.SubstanceID 
UNION ALL 
SELECT f.FieldName, s.Substance, NULL AS Quantity 
FROM dbo.Fields f 
CROSS JOIN dbo.Substances s 
WHERE NOT EXISTS (
    SELECT * FROM dbo.AppliedSubstances a 
    WHERE a.FieldID=f.FieldID AND a.SubstanceID=s.SubstanceID 
) 

Oder eine kürzere Version von Fremden (mit einer anderen Bedeutung, wenn Sie einige Substanzen haben, die wurden nur für einige Felder angewendet):

SELECT f.FieldName, s.Substance, a.Quantity 
FROM dbo.AppliedSubstances a 
RIGHT JOIN dbo.Fields f ON f.FieldID = a.FieldID 
INNER JOIN dbo.Substances s ON s.SubstanceID = ISNULL(a.SubstanceID,s.SubstanceID) 
Verwandte Themen