T-SQL: Affichage des données à partir de plusieurs colonnes dans une colonne de sortie en utilisant CASE et COALESCE

StackOverflow https://stackoverflow.com/questions/2424820

Question

J'ai le code SQL suivant qui va à l'encontre d'une base de données de demande de changement. Chaque enregistrement a plusieurs colonnes qui représentent les régions touchées des États-Unis. Si le changement affecte une région, la valeur est 1, sinon NULL.

Je suis d'ajouter les valeurs dans chaque colonne pour déterminer si plus d'une région est affectée, la réponse sera supérieure à 1.

Je besoin d'aide dans la façon de faire un changement à mon COALESCE et / ou instructions CASE à la liste toutes les zones touchées qui ont une valeur de 1, dans la sortie « Affected_Area ».

Régions touchées sept derniers jours


SELECT ID, 
(ISNULL(southeast,0) + ISNULL(allregions,0) + ISNULL(midamerica,0)  + ISNULL(northcentral,0) + ISNULL(northeast,0) + ISNULL(pacificnorthwest,0) + ISNULL(pacificsouthwest,0)),
Affected_Area = COALESCE(
CASE WHEN [allregions]=1 THEN 'All Regions' ELSE NULL END,
CASE WHEN [midamerica]=1 THEN 'Mid-America' ELSE NULL END,
CASE WHEN [northcentral]=1 THEN 'North Central' ELSE NULL END,
CASE WHEN [northeast]=1 THEN 'Northeast' ELSE NULL END,
CASE WHEN [pacificnorthwest]=1 THEN 'Pacific Northwest' ELSE NULL END,
CASE WHEN [pacificsouthwest]=1 THEN 'Pacific Southwest' ELSE NULL END,
CASE WHEN [southeast]=1 THEN 'Southeast' ELSE NULL END
),
FROM [DB_Reporting].[dbo].change c with (nolock)
WHERE convert(varchar(10),([needed_by_date]),110) BETWEEN (DATEADD(DD,-7,CONVERT(VARCHAR(10),GetDATE(),110))) AND (DATEADD(DD,-1,CONVERT(VARCHAR(10),GetDATE(),110)))

Toute aide est appréciée!

Hank Stallings

Était-ce utile?

La solution

Essayez quelque chose comme ceci:

SELECT ID, 
    (ISNULL(southeast,0) + ISNULL(allregions,0) + ISNULL(midamerica,0)  + ISNULL(northcentral,0) + ISNULL(northeast,0) + ISNULL(pacificnorthwest,0) + ISNULL(pacificsouthwest,0)),
    Affected_Area = 
        CASE WHEN [allregions]=1 THEN 'All Regions, ' ELSE '' END + 
        CASE WHEN [midamerica]=1 THEN 'Mid-America, ' ELSE '' END + 
        CASE WHEN [northcentral]=1 THEN 'North Central, ' ELSE '' END + 
        CASE WHEN [northeast]=1 THEN 'Northeast, ' ELSE '' END + 
        CASE WHEN [pacificnorthwest]=1 THEN 'Pacific Northwest, ' ELSE '' END + 
        CASE WHEN [pacificsouthwest]=1 THEN 'Pacific Southwest, ' ELSE '' END + 
        CASE WHEN [southeast]=1 THEN 'Southeast' ELSE '' END 
FROM [DB_Reporting].[dbo].change c with (nolock)
WHERE convert(varchar(10),([needed_by_date]),110) BETWEEN (DATEADD(DD,-7,CONVERT(VARCHAR(10),GetDATE(),110))) AND (DATEADD(DD,-1,CONVERT(VARCHAR(10),GetDATE(),110)))    

Vous aurez probablement besoin de couper une virgule de fin.

Autres conseils

Avez-vous une possibilité de changer la conception de ce tableau? Il semble moins correct - vous seriez mieux avec une colonne de région avec une FK au large à une table de régions. Que ferez-vous avec ce qui précède, si vous devez ajouter une autre région ...

Si vous n'êtes pas, vous pouvez utiliser la commande PIVOT et créer une vue plus normalisée que vous pouvez ensuite utiliser pour interroger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top