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.
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
;