2017-10-17 1 views
0

Nouveauté de sql et de nouvelle pile, je suis désolé si c'est une question en double. Je suis si nouveau que je ne suis même pas sûr de savoir comment formuler la question, ou si c'est possible.Comment sélectionner plusieurs champs à partir d'une seule colonne et en sortir sur une seule ligne

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

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

Je ne sais pas comment composer une instruction select pour ce que je veux, donc je vais vous montrer ce que je voudrais que ma sortie soit des tableaux ci-dessus

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

Mon cas est plus complexe que cela. Je dois retourner une seule ligne pour chaque identifiant, mais tout ce que j'écris retourne plusieurs lignes pour chaque code.

Je veux retourner tout le monde de la table2 et montrer s'ils ont des codes de pizza ou de fromage. S'ils ne les laissent pas vides.

+1

vous aurez besoin d'avoir une table avec les codes pizza .... sql ne connaîtra pas zebra jusqu'à ce que vous le référenciez à la table de codes sinon ce sera un cas massif ou déclaration iif ... et une jointure GAUCHE devrait résoudre ce problème – maSTAShuFu

+0

Que devrait faire votre requête si une nouvelle ligne devait être ajoutée dans la table 1 {1, "ham"} – SEarle1986

+1

Aussi, pourquoi "zebra" n'apparaît pas pour Ralph? – SEarle1986

Répondre

0

Voici une requête qui vous donnera vos résultats. Ce n'est pas très évolutif mais sans connaître le cas d'utilisation réel, vous obtiendrez les résultats souhaités de votre exemple.

Création des données de test:

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') 

Requête:

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

Voici une version plus courte de ce que vous avez besoin

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

Pourriez-vous s'il vous plaît souligner * pourquoi * et * comment * cela résout le problème OP? Bien qu'il puisse techniquement répondre à la question OP, juste un peu de code collé n'est pas une bonne réponse. –

0

Si vous connaissez les valeurs de codes à l'avance vous pouvez convertir des lignes en colonnes avec l'opérateur PIVOT. La requête suivante:

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  

sera de retour

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

Vous pouvez modifier le nom des colonnes ou remplacer NULL avec une chaîne vide:

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  

L'opérateur PIVOT calcule un agrégat pour chacun d'un ensemble de valeurs et l'expose comme une colonne, en utilisant le nom des valeurs. Dans le cas, pour les valeurs cheese et pizza, il calcule MAX(codes), essentiellement la valeur elle-même, et l'expose en tant que colonnes cheese et pizza.