Pergunta

Eu tenho o seguinte código SQL que é executado contra um banco de dados Pedido de Mudança. Cada registro tem várias colunas que representam afetadas regiões dos EUA. Se a alteração afecta uma região o valor será de 1 caso contrário, NULL.

Então, eu estou adicionando os valores em cada coluna para determinar se mais de uma região é afetada, a resposta será maior que 1.

Preciso de ajuda em como fazer uma mudança para o meu COALESCE e / ou instruções CASE para listar todas as áreas afetadas que têm um valor de 1, na saída "Affected_Area".

regiões afectadas últimos sete dias


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

Qualquer ajuda é apreciada!

Hank Stallings

Foi útil?

Solução

Tente algo parecido com isto:

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

Você provavelmente vai precisar cortar uma vírgula à direita.

Outras dicas

Você tem alguma capacidade de alterar o design desta mesa? Parece menos do que correto - você seria melhor com uma coluna região com uma FK fora a uma mesa regiões. O que você vai fazer com o acima exposto, se você tem que adicionar uma outra região ...

Se você não, você pode querer usar o comando PIVOT e criar uma visão mais normalizada que você pode usar para consulta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top