2015-07-17 2 views
-2

Вот моя входная таблица, как:PIVOT столбец даты в SQL Server 2012

date  E1 E2 E3 E4 
05-27-15 1 1 2 3 
05-28-15 2 3  5 
05-29-15 3 4  2 

Я хотел бы мой выход будет:

Error type 05-27-15 05-28-15 05-29-15 Total Percentage% 
E1    1   2   3  6  6/35 
E2    1   3   4  8  8/35 
E3    2        2  2/35 
E4    3   5   2  10  10/35 

Я знаю, что это небольшая проблема, но я не получаю мой ответ подобен этому из другой справки Google.

Пожалуйста, помогите мне разобраться. Благодарю.

+0

Но у меня есть несколько дат в течение двух лет , – Jack

+0

, где процент 35 приходит @DatabasePirate – mohan111

+0

@DatabasePirate этот ответ полезен для вас – mohan111

ответ

0

согласно моему предположению и данных, предоставленных мы можем получить с помощью Cross Применить, но я не ясно, о колонке Процент

declare @t table (dated varchar(10),E1 int,E2 int,E3 int,E4 int) 
insert into @t 
(dated,E1,E2,E3,E4)values 
('05-27-15',1,1,2,3), 
('05-28-15',2,3,NULL,5), 
('05-29-15',3,4,null,2) 


Select P.col,MAX([05-27-15])[05-27-15], 
MAX([05-28-15])[05-28-15], 
MAX([05-29-15])[05-29-15], 
SUM([05-27-15])+SUM(COALESCE([05-28-15],0))+SUM(COALESCE([05-29-15],0))Total 
from (
select col,[05-27-15],[05-28-15],[05-29-15] from (
select * from @t 
CROSS APPLY(values('E1',E1),('E2',E2),('E3',E3),('E4',E4))cs (col,val))PP 
PIVOT(MAX(val) for dated IN ([05-27-15],[05-28-15],[05-29-15]))P)P 
GROUP BY P.col 

Динамическая версия:

if OBJECT_ID('tempdb..#temp') is not null 
begin 
drop table #temp 
end 


CREATE table #temp (dated varchar(10),E1 int,E2 int,E3 int,E4 int) 
insert into #temp 
(dated,E1,E2,E3,E4)values 
('05-27-15',1,1,2,3), 
('05-28-15',2,3,NULL,5), 
('05-29-15',3,4,null,2) 

DECLARE @statement NVARCHAR(max) 
,@columns NVARCHAR(max), 
     @select_columns NVARCHAR(max) 

SELECT @select_columns = Isnull(@select_columns + ', ', '')+ N'MAX([' + tbl.dated + ']) AS ['+tbl.dated+']' 
FROM (SELECT DISTINCT dated 
     FROM #temp) AS tbl 

SELECT @columns = Isnull(@columns + ', ', '') + N'[' + tbl.dated+ ']' 
FROM (SELECT DISTINCT dated 
     FROM #temp) AS tbl 

SELECT @statement = 'Select P.col,' + @select_columns 
        + ' from ( 
    select col,' + @columns 
        + ' from (
    select * from #temp 
    CROSS APPLY(values(''E1'',E1),(''E2'',E2),(''E3'',E3),(''E4'',E4))cs (col,val))PP 
    PIVOT(MAX(val) for dated IN (' + @columns 
        + ')) as PVT)P 
    GROUP BY P.COL 
' 

PRINT @statement 
EXEC sp_executesql @statement = @statement 
+0

Спасибо mohan111, но вы жестко указываете даты, у меня есть несколько дат в столбце даты, например, через 2-3 года. Я могу указать тип ошибки, но не дату. является их другим решением для него. любое динамическое решение. – Jack

+0

мы можем сделать это в динамическом режиме, но позвольте мне разобраться с этим. Вернемся к вам @DatabasePirate – mohan111

+0

@DatabasePirate теперь проверяет динамическую версию, чтобы вы могли динамически отправлять данные – mohan111

Смежные вопросы