2016-11-25 2 views
0

я следующая таблица, tblCPDatesтаблица запроса реорганизовать данные

cDate date 
cp nvarchar(10) 

Пример данных

cDate  cp 
2016-01-01 AB 
2016-01-01 MN 
2016-02-01 EF 
2016-03-01 AB 
2016-04-01 MN 

Что я хотел

cDate  AB MN EF 
2016-01-01 1 1  0 
2016-02-01 0 0  1 
2016-03-01 1 0  0 
2016-04-01 0 1  0 

Возможно ли это?

Я попытался следующие, но, очевидно, только возвращает последнюю дату

select * from 
(
    select distinct cDate, cp from tblCPDDates 
)source pivot(max(cDate) for cp in ([AB], [MN], [EF])) as pvt 

ответ

3

Вы могли бы сделать это с агрегированной CASE;

Примеры данных

CREATE TABLE #tblCPDates (cDate date, cp nvarchar(10)) 
INSERT INTO #tblCPDates (cDate, cp) 
VALUES 
('2016-01-01','AB') 
,('2016-01-01','MN') 
,('2016-02-01','EF') 
,('2016-03-01','AB') 
,('2016-04-01','MN') 

Запрос

SELECT 
    cDate 
    ,SUM(CASE WHEN cp = 'AB' THEN 1 ELSE 0 END) AB 
    ,SUM(CASE WHEN cp = 'MN' THEN 1 ELSE 0 END) MN 
    ,SUM(CASE WHEN cp = 'EF' THEN 1 ELSE 0 END) EF 
FROM #tblCPDates 
GROUP BY cDate 

Выход

cDate  AB MN EF 
2016-01-01 1 1 0 
2016-02-01 0 0 1 
2016-03-01 1 0 0 
2016-04-01 0 1 0 
1

Используя стержень для результата получим:

`CREATE TABLE #table(Id INT,cDate DATE,cp VARCHAR(10)) 
INSERT INTO #table(Id,cDate ,cp) 
SELECT 1,'2016-01-01','AB' UNION ALL 
SELECT 1,'2016-01-01','MN' UNION ALL 
SELECT 1,'2016-02-01','EF' UNION ALL 
SELECT 1,'2016-03-01','AB' UNION ALL 
SELECT 1,'2016-04-01','MN' 

SELECT cDate,ISNULL([AB],0) [AB],ISNULL([MN],0) [MN],ISNULL([EF],0) [EF] 
FROM 
(SELECT Id,cDate ,cp FROM #table) A PIVOT (MAX(Id) FOR cp IN ([AB],[MN],[EF])) pvt` 
+0

Хорошее использование стержня. Результирующий набор возвращает нули, а не нули, это что-то, что можно изменить? –

+0

Я обновляю свой запрос, теперь получаю нулевое значение как ноль – Mansoor

2

попробовать это: с помощью шарнира это проще:

 CREATE TABLE #tblCPDates (cDate date, cp nvarchar(10)) 
     INSERT INTO #tblCPDates (cDate, cp) 
     VALUES 
     ('2016-01-01','AB') 
     ,('2016-01-01','MN') 
     ,('2016-02-01','EF') 
     ,('2016-03-01','AB') 
     ,('2016-04-01','MN') 



    select * 
    from 
     (
     select cDate, cp 
     from #tblCPDates 
    ) src 
    pivot 
    (
     Count(cp) 
     for cp in ([AB], [MN],[EF]) 
    ) piv; 
1

TryThis.

  select 
      cDate  , 
      case when ab='AB' then 1 else 0 end as AB, 
      case when MN='MN' then 1 else 0 end as MN, 
      case when EF='EF' then 1 else 0 end as EF 
      from 
      (
       select distinct cDate, cp from tblCPDates 
      )source pivot(max(cp) for cp in ([AB], [MN], [EF])) as pvt 
Смежные вопросы