2017-10-17 3 views
0

Neu zu SQL und neu zu stapeln, so tut mir leid, wenn dies eine doppelte Frage ist. Ich bin so neu, ich bin mir nicht einmal sicher, wie ich die Frage formulieren soll oder ob es möglich ist.So wählen Sie mehrere Felder aus einer einzigen Spalte und Ausgabe in einer einzigen Zeile

table1 
----------------------------- 
| table2.key | codes | 
----------------------------- 
| 1   | 'pizza' | 
----------------------------- 
| 1   | 'cheese' | 
----------------------------- 
| 2   | 'pizza' | 
----------------------------- 
| 3   | 'zebra' | 

table2 
------------------- 
| key | name | 
------------------- 
| 1 | 'steve' | 
------------------- 
| 2 | 'john' | 
------------------- 
| 3 | 'ralph | 

Nicht sicher, wie eine select-Anweisung komponieren, was ich will, so werde ich Ihnen zeigen, was ich möchte für meine Ausgabe aus den obigen Tabellen mehr

Desired output 
------------------------------------ 
| key | Name | cPizza | cCheese| 
------------------------------------ 
| 1 |'steve'| 'pizza'|'cheese' | 
------------------------------------ 
| 2 |'john' | 'pizza'| ''  | 
------------------------------------ 
| 3 |'ralph'| '' | '' | 

Mein Fall sein komplex als das. Ich muss für jede ID eine einzelne Zeile zurückgeben, aber alles, was ich schreibe, gibt mehrere Zeilen für jeden Code zurück.

Ich möchte alle aus Tabelle2 zurückgeben und zeigen, ob sie Pizza oder Käse-Codes haben. Wenn sie sie nicht leer lassen.

+1

müssen Sie eine Tabelle mit den Pizzacodes haben .... sql wird Zebra nicht kennen, bis Sie es auf die Tabelle der Codes beziehen, andernfalls wird es ein massiver Fall oder eine iif Aussage sein ... und ein LINKER beitreten sollte dies lösen – maSTAShuFu

+0

Was sollte Ihre Abfrage tun, wenn eine neue Zeile in Tabelle 1 hinzugefügt werden würde {1, "ham"} – SEarle1986

+1

Auch warum "Zebra" nicht für Ralph angezeigt? – SEarle1986

Antwort

0

Hier ist eine Abfrage, die Ihnen Ihre Ergebnisse geben wird. Dies ist nicht sehr skalierbar, aber ohne den tatsächlichen Anwendungsfall zu kennen, werden Sie die gewünschten Ergebnisse aus Ihrem Beispiel erhalten.

Erstellen von Testdaten:

DECLARE @table1 TABLE (
    tbl_key INT, 
    codes NVARCHAR(MAX) 
) 

INSERT @table1 VALUES 
(1, 'pizza'), 
(1, 'cheese'), 
(2, 'pizza'), 
(3, 'zebra') 

DECLARE @table2 TABLE (
    tbl_key INT, 
    name NVARCHAR(MAX) 
) 

INSERT @table2 VALUES 
(1, 'steve'), 
(2, 'john'), 
(3, 'ralph') 

Abfrage:

SELECT 
    tbl2.tbl_key AS [key], 
    tbl2.name AS [Name], 
    ISNULL(pizza_tbl.codes, '') AS cPizza, 
    ISNULL(cheese_tbl.codes, '') AS cCheese 
FROM @table2 tbl2 
LEFT JOIN (
    SELECT 
     tbl_key, 
     codes 
    FROM @table1 tbl1 
    WHERE codes = 'cheese' 
    ) cheese_tbl ON 
    tbl2.tbl_key = cheese_tbl.tbl_key 
LEFT JOIN (
    SELECT 
     tbl_key, 
     codes 
    FROM @table1 tbl1 
    WHERE codes = 'pizza' 
    ) pizza_tbl ON 
    tbl2.tbl_key = pizza_tbl.tbl_key 
0

Hier ist eine kürzere Version von dem, was Sie brauchen,

DECLARE @table1 TABLE (
    tbl_key INT, 
    codes NVARCHAR(MAX) 
) 

INSERT @table1 VALUES 
(1, 'pizza'), 
(1, 'cheese'), 
(2, 'pizza'), 
(3, 'zebra') 

DECLARE @table2 TABLE (
    tbl_key INT, 
    name NVARCHAR(MAX) 
) 

INSERT @table2 VALUES 
(1, 'steve'), 
(2, 'john'), 
(3, 'ralph') 


select distinct a.tbl_key as [key] ,a.Name ,isnull(ab.codes,'') as cPizza,isnull(ac.codes,'') as cCheese,isnull(ad.codes,'') as cZebra 
from @table2 a 

outer apply (select codes from @table1 where a.tbl_key = tbl_key and codes = 'pizza') as ab 
outer apply (select codes from @table1 where a.tbl_key = tbl_key and codes = 'cheese') as ac 
outer apply (select codes from @table1 where a.tbl_key = tbl_key and codes = 'zebra') as ad 
+1

Könnten Sie bitte * warum * und * wie * das Problem lösen? Während es die OP-Frage technisch beantworten kann, ist nur ein eingefügter Code keine * gute * Antwort. –

0

Wenn Sie die Werte von codes im Voraus Sie können Zeilen mit dem Operator PIVOT in Spalten konvertieren. Die folgende Abfrage:

select tbl_key,name,[pizza] ,[cheese] 
from (select t2.tbl_key,t2.name,t1.codes 
     from table1 t1 inner join table2 t2 on t1.tbl_key=t2.tbl_key 
    ) as source 
PIVOT 
(
    MAX(codes) 
    FOR codes in ([cheese],[pizza]) 
) as pvt  

tbl_key name pizza cheese 
1  steve pizza cheese 
2  john pizza NULL 
3  ralph NULL NULL 

Will return können Sie den Namen der Spalten ändern oder NULL mit einem leeren String ersetzen:

select tbl_key,name,ISNULL([pizza],'') as cPizza ,ISNULL([cheese],'') as cCheese 
from (select t2.tbl_key,t2.name,t1.codes 
     from table1 t1 inner join table2 t2 on t1.tbl_key=t2.tbl_key 
    ) as source 
PIVOT 
(
    MAX(codes) 
    FOR codes in ([cheese],[pizza]) 
) as pvt  

Der PIVOT-Operator berechnet ein Aggregat für jeder einer Menge von Werten und legt sie als eine Spalte unter Verwendung des Wertes name offen. In diesem Fall wird für die Werte cheese und pizzaMAX(codes), im Wesentlichen der Wert selbst, berechnet und als cheese und pizza Spalten angezeigt.

Verwandte Themen