2010-03-11 2 views
1

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

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

Мне нужна помощь в том, как внести изменения в моей COALESCE и/или CASE для отображения всех затронутых областей, которые имеют значение 1, в выводе «Affected_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))) 

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

Hank Сталлингс

+3

Какой желаемый выход? – RedFilter

+0

Вам понравилась бы одна строка для каждого региона или одна строка со всеми затронутыми областями, разделенными запятыми в одном столбце? – van

ответ

1

попробовать что-то вроде этого:

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

OrbMan, спасибо за ответ ... Я попробовал пример кода, который вы дали, и он заполняет только «Все регионы» ... другие возвращаются с результатом NULL. Что я хотел бы, когда он перечисляет multple регионов форматировать нравится: юго-восток, северо-восток Спасибо, –

+0

Я предполагаю, что, когда все регионы присутствуют, вы не хотите, чтобы другие. На данный момент ваши требования неясны. – RedFilter

+0

Попробуйте обновленный запрос. – RedFilter

0

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

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

+0

Нет. Я могу отвечать только на него. Я никогда не использовал команду PIVOT. Можете ли вы привести пример этого на основе моего кода? Спасибо, что ответили. –