T-SQL: Viendo los datos de varias columnas en una sola columna de salida al utilizar CASE y se unen

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

Pregunta

Tengo el siguiente código SQL que se ejecuta contra una base de datos de solicitud de cambio. Cada registro tiene varias columnas que representan afectadas regiones de Estados Unidos. Si el cambio afecta a una región del valor será NULL 1 en caso contrario.

Así que estoy añadiendo los valores en cada columna para determinar si se ve afectada más de una región, la respuesta será mayor que 1.

Necesito ayuda en la forma de hacer un cambio en mi unirse y / o instrucciones CASE para listar todas las zonas afectadas que tienen un valor de 1, en la salida "Affected_Area".

regiones afectadas por los últimos siete días


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

Cualquier ayuda se agradece!

Hank Stallings

¿Fue útil?

Solución

Trate algo como esto:

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

lo más probable es necesario recortar un coma final.

Otros consejos

¿Tiene alguna posibilidad de cambiar el diseño de esta mesa? Parece menos que correcto - que sería mejor con una columna región con una FK fuera a una mesa regiones. ¿Qué vas a hacer con lo anterior, si usted tiene que añadir otra región ...

Si no, es posible que desee utilizar el comando de pivote y crear una visión más normalizado que se puede utilizar para consultar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top