T-SQL: отображение данных из нескольких столбцов в один выходной столбец с использованием CASE и COALESCE - PullRequest
1 голос
/ 11 марта 2010

У меня есть следующий код SQL, который работает с базой данных запроса на изменение. Каждая запись имеет несколько столбцов, которые представляют затронутые регионы США. Если изменение влияет на регион, значение будет равно 1, в противном случае NULL.

Итак, я добавляю значения в каждый столбец, чтобы определить, затрагивается ли более одного региона, ответ будет больше 1.

Мне нужна помощь в том, как внести изменения в мои операторы COALESCE и / или CASE, чтобы перечислить все затронутые области, которые имеют значение 1, в выводе "Affered_Area".

Затронутые регионы за последние семь дней


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

Любая помощь приветствуется!

Хэнк Сталлингс

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Попробуйте что-то вроде этого:

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

Скорее всего, вам придется обрезать запятую.

0 голосов
/ 11 марта 2010

Есть ли у вас возможность изменить дизайн этой таблицы? Кажется, это не совсем правильно - вам лучше использовать столбец региона с FK в таблице регионов. Что вы будете делать с вышеуказанным, если вам нужно добавить еще один регион ...

Если вы этого не сделаете, вы можете использовать команду PIVOT и создать более нормализованное представление, которое затем можно будет использовать для запроса.

...