2009-05-29 6 views
2

Disons que j'ai une table avec des colonnes telles que:Comment puis-je sélectionner uniquement les propriétés communes d'un jeu de résultats?

  • ID
  • Name
  • City
  • State
  • ZIP

J'ai besoin d'écrire une requête qui retourne seulement une ligne. Cette ligne inclura City, State et ZIP, mais je veux seulement qu'un champ ait une valeur si toutes les valeurs dans le jeu de résultats sont identiques, sinon je veux que le champ soit null. Par exemple, si chaque enregistrement a le même état, State sera dans le résultat retourné. Si juste un des résultats a un état différent, je veux que le champ soit null. Est-ce que quelque chose comme ceci est possible dans SQL Server 2005?

Fondamentalement, je veux une requête comme ceci:

SELECT City, State, ZIP 
FROM Users 
WHERE ID IN(1,2,3,4,5,6) 

Mais seulement revenir une seule rangée, avec les spécifications décrites plus haut.

Répondre

6
SELECT 
    CASE WHEN COUNT(DISTINCT city) = 1 THEN MAX(city) ELSE NULL END AS city, 
    CASE WHEN COUNT(DISTINCT state) = 1 THEN MAX(state) ELSE NULL END AS state, 
    CASE WHEN COUNT(DISTINCT zip) = 1 THEN MAX(zip) ELSE NULL END AS zip 
FROM Users 
WHERE ID IN(1,2,3,4,5,6) 

Après autre réponse:

SELECT 
    CASE WHEN COUNT(DISTINCT NULLIF(city,'**NULL**')) = 1 THEN MAX(city) ELSE NULL END AS city, 
    CASE WHEN COUNT(DISTINCT NULLIF(state,'**NULL**')) = 1 THEN MAX(state) ELSE NULL END AS state, 
    CASE WHEN COUNT(DISTINCT NULLIF(zip,'**NULL**')) = 1 THEN MAX(zip) ELSE NULL END AS zip 
FROM Users 
WHERE ID IN(1,2,3,4,5,6) 
+0

pour faire de cette solution en toute sécurité, vous devez utiliser une contrainte de vérification pour vous assurer que ** NULL ** ne peut pas être enregistré dans l'une des colonnes concernées –

+0

Bon point. J'ai seulement utilisé ** NULL ** pour l'emphase, mais j'en aurais toujours besoin pour une chaîne vide. – gbn

2

Si des colonnes ne sont pas annulable, ou si vous voulez ignorer alors la réponse nulls de GBN est correcte. Si, cependant, vous devez traiter les valeurs NULL comme des valeurs différentes, essayez ceci:

CASE WHEN COUNT(DISTINCT city) = 1 
     AND COUNT(city) = COUNT(*) 
    THEN MAX(city) ELSE NULL END AS city 
+0

J'ai complètement oublié les valeurs NULL. Je veux traiter Nulls différemment. C'est une grande aide. Merci. –

+0

Bon point. Réponse mise à jour – gbn

Questions connexes