web-dev-qa-db-fra.com

Sélectionnez lorsque regrouper par contient plus d'une ligne avec la même valeur?

J'essaie d'écrire une requête qui renvoie une ligne du tableau A chaque fois qu'une colonne du tableau joint B contient plusieurs valeurs distinctes pour une seule ligne correspondante dans le tableau A. (A -> B est une relation 1 -> plusieurs). J'ai construit un violon SQL pour le démontrer en contexte: http://sqlfiddle.com/#!6/83952/1

Dans ce violon, la colonne design de la table perf_ticket_type Doit être la même pour chaque ticket_type Qui a le même perf_id, Mais j'essaie de sélectionnez uniquement les instances où il ne l'est pas. Donc, pour perf_id 3, il y a plus d'un design unique renvoyé avec la requête que j'utilise actuellement.

Ce que je veux comme résultat, ce sont les deux colonnes de la table performance uniquement pour perf_id 3, basées sur les valeurs multiples de design pour cela perf_id Dans la table jointe.

J'ai été frustré par la compréhension de GROUP BY dans le passé, donc je ne sais pas s'il y a quelque chose de différent que je pourrais faire ici pour obtenir le résultat souhaité. Pour le moment, je pense que je peux sélectionner ce que j'ai dans le violon dans une table temporaire, puis faire un autre sélectionner sur que avec une GROUP BY perf_id HAVING COUNT(*) > 1 pour obtenir ce que je veux (selon sélectionner les lignes où la colonne contient les mêmes données dans plus d'un enregistrement ), mais cela semble être une étape supplémentaire.

5
NReilingh

Votre idée est bonne mais vous avez besoin de HAVING COUNT(DISTINCT design) > 1

Comme ça:

WITH multi_design_perfs AS
(SELECT b.perf_id 
FROM perf_ticket_type b
GROUP BY b.perf_id
HAVING COUNT(DISTINCT b.design) > 1
)
SELECT m.perf_id, 
    STUFF((select ', ' + CAST(b.design AS varchar(10))
     FROM perf_ticket_type b 
     WHERE b.perf_id = m.perf_id
     ORDER BY b.design
     FOR XML PATH(''), TYPE).value('.','varchar(max)'),1,2,'')
FROM multi_design_perfs m
;
4
Rob Farley