Список SQL, разделенный запятыми из нескольких столбцов - PullRequest
4 голосов
/ 22 октября 2009

У меня есть данные, которые выглядят так:

CUSTOMER_ID  OPERDAYSJUL  OPERDAYSAUG  OPERDAYSSEP ... OPERDAYSJUN
1            30           15           2
2            5            1            0
3            6            0            12
4            12           5            23

Для каждого customer_id мне нужен список с разделителями-запятыми, указывающий, в каких месяцах работает клиент:

CUSTOMER_ID  OPERATING_MONTHS
1            Jul, Aug, Sep
2            Jul, Aug
3            Jul, Sep
4            Jul, Aug, Sep

и т. Д. Как я могу использовать SQL Server 2005 SQL (не T-SQL), чтобы легко создать этот список через запятую?

Большинство решений, которые я вижу здесь для переполнения стека и в других местах, похоже, создают списки через запятую, основанные на соединении значений нескольких строк, а не значений столбцов:

  • T-SQL
  • ДЛЯ ПУТИ XML ('')
  • Коррелированный подзапрос в сочетании с REPLACE / STUFF / SUBSTRING

Я что-то упускаю из виду? Заранее благодарим за помощь или указание на подходящее существующее решение здесь.

Ответы [ 5 ]

4 голосов
/ 22 октября 2009

Снимает лишнюю запятую

SELECT 
  CUSTOMER_ID,
  SUBSTRING(
    CASE WHEN OPERDAYSJUL > 0 THEN ', Jul' ELSE '' END +
    CASE WHEN OPERDAYSAUG > 0 THEN ', Aug' ELSE '' END +
    ...
    CASE WHEN OPERDAYSJUN > 0 THEN ', Jun' ELSE '' END,
   3, 255)
FROM TheTable
2 голосов
/ 22 октября 2009
declare @t table (CUSTOMER_ID int
  , OPERDAYSJUL int
  , OPERDAYSAUG int
  , OPERDAYSSEP int
  -- ... rest of 9 months here
  );

insert into @t (CUSTOMER_ID, OPERDAYSJUL, OPERDAYSAUG, OPERDAYSSEP)
select 1, 30, 15, 22 union all
select 2, 0, 10, 10 union all
select 3, 0, 0, 10 union all
select 4, 0, 0, 0 union all
select 5, 10, 0, 10 union all
select 6, 10, 10, 0 union all
select 7, 0, 10, 0 union all
select 8, 10, 0, 0;    

with cte_months as (
select CUSTOMER_ID
  , case when OPERDAYSJUL=0 then '' else ', Jul' end 
  + case when OPERDAYSAUG=0 then '' else ', Aug' end
  + case when OPERDAYSSEP=0 then '' else ', Sep' end
  -- ... rest of 9 months here
  as month_list
 from @t)
 select CUSTOMER_ID, substring(month_list, 3, 70) 
 from cte_months;
1 голос
/ 22 октября 2009

Вы можете сделать что-то вроде этого.

CONCAT(CASE OPERDAYSJUL > 0 THEN "Jul," ELSE "" END,CASE OPERDAYSAUG > 0 THEN "Aug" ELSE "" END ... )
1 голос
/ 22 октября 2009

Если в вашей таблице 13 столбцов (по 1 на каждый месяц года + CUSTOMER_ID), вы можете написать что-то вроде:

SELECT 
  CUSTOMER_ID,
  CASE OPERDAYSJUL > 0 THEN 'Jul,' ELSE '' END +
  CASE OPERDAYSAUG > 0 THEN 'Aug,' ELSE '' END +
  ...
FROM MyTable

и создайте строку, представляющую ваш список через запятую, используя операторы CASE, по одному на каждый месяц.

0 голосов
/ 22 октября 2009
select 
   customer_id,
   case when len(operating_month) > 0 then 
       left(operating_month, len(operating_month) - 1)
   else 
       operating_month 
   end as operating_month
from
(
   SELECT CUSTOMER_ID,  
   CASE OPERDAYSJUL > 0 THEN 'Jul,' ELSE '' END 
   +  CASE OPERDAYSAUG > 0 THEN 'Aug,' ELSE '' END 
   +  ... 
   as operating_month
   FROM MyTable
) as x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...