У меня есть следующая таблица:

enter image description here

Я хотел бы конвертировать его следующим образом:

+------------+---------------------+---------------------+
| Child_Code |     SewingStart     |      SewingEnd      |
+------------+---------------------+---------------------+
|     000001 | 2017-02-21 00:00:00 | 2017-03-21 00:00:00 |
+------------+---------------------+---------------------+

Любая помощь, пожалуйста!

1
TanvirArjel 21 Мар 2017 в 14:59

2 ответа

Лучший ответ

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

select child_code,
       max(case when seqnum = 1 then plan_date end) as plan_date_1,
       max(case when seqnum = 2 then plan_date end) as plan_date_2
from (select t.*,
             row_number() over (partition by child_code order by plan_date) as seqnum
      from t
     ) t
group by child_code;

Вы можете использовать этот метод, только если вы знаете максимальное количество плановых дат, которые вы хотите. В противном случае вам нужно будет использовать динамический разворот. Идея та же, но нужно создать строку запроса и затем передать ее sp_executesql.

РЕДАКТИРОВАТЬ:

Если у вас есть только два значения, то group by, вероятно, проще. Следующее обрабатывает случай, когда есть только одно значение:

select child_code, min(plan_date) as plan_date_1,
       (case when min(plan_date) <> max(plan_date) then max(plan_date)
        end) as plan_date_2
from t
group by child_code;
2
Gordon Linoff 21 Мар 2017 в 12:19

Вам нужно будет использовать динамический sql, если максимальное число plan_date неизвестно. Вам нужно будет использовать row_number() для нумерации каждого списка, разделенного Child_Code, для использования с < сильный > pivot() .

Испытательная установка:

create table t (child_code varchar(6), plan_date datetime);
insert into t values ('000001','20170221'),('000001','20170321');
declare @cols nvarchar(max);
declare @sql  nvarchar(max);

  select @cols = stuff((
    select distinct 
      ',' + quotename('Plan_Date_'
          +convert(nvarchar(10),row_number() over (
              partition by Child_Code 
              order by     Plan_Date 
          ))
          )
      from t 
      for xml path (''), type).value('.','nvarchar(max)')
    ,1,1,'');

select @sql = '
 select Child_Code, ' + @cols + '
 from  (
  select 
      Child_Code
    , Plan_Date
    , rn=''Plan_Date_''+convert(nvarchar(10),row_number() over (
          partition by Child_Code 
          order by     Plan_Date 
        ))
  from t
    ) as a
 pivot (max([Plan_Date]) for [rn] in (' + @cols + ') ) p';
 select @sql as CodeGenerated;
 exec sp_executesql @sql;

Rextester демо : http://rextester.com/YQCR87525

Сгенерированный код:

 select Child_Code, [Plan_Date_1],[Plan_Date_2]
 from  (
  select 
      Child_Code
    , Plan_Date
    , rn='Plan_Date_'+convert(nvarchar(10),row_number() over (
          partition by Child_Code 
          order by     Plan_Date 
        ))
  from t
    ) as a
 pivot (max([Plan_Date]) for [rn] in ([Plan_Date_1],[Plan_Date_2]) ) p

Возвращает

+------------+---------------------+---------------------+
| Child_Code |     Plan_Date_1     |     Plan_Date_2     |
+------------+---------------------+---------------------+
|     000001 | 21.02.2017 00:00:00 | 21.03.2017 00:00:00 |
+------------+---------------------+---------------------+
1
SqlZim 21 Мар 2017 в 12:06