Динамический SQL PIVOT:
create table temp
(
date datetime,
category varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category)
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p '
execute(@query)
drop table temp
Результаты:
Date ABC DEF GHI
2012-01-01 00:00:00.000 1000.00 NULL NULL
2012-02-01 00:00:00.000 NULL 500.00 800.00
2012-02-10 00:00:00.000 NULL 700.00 NULL
2012-03-01 00:00:00.000 1100.00 NULL NULL
Как говорили другие, это связано с расширением Microsoft C ++. Хотя флаг /Za
не рекомендуется, так как он может сломать вещи.
Вместо этого используйте переключатель /permissive-
для лучшего соответствия стандартам, и вы получите здоровые ошибки для этих случаев. Обратите внимание, что этот флаг доступен с VS 2017.
Коммутатор / Za не поддерживает определенные файлы заголовков Microsoft SDK. В противоположность этому / permissive - предлагает полезный режим соответствия, где ввод кода C ++ интерпретируется в соответствии с правилами ISO C ++, но также позволяет соответствовать расширениям, необходимым для компиляции C ++ для целей, поддерживаемых Visual C ++.
blockquote>Дополнительная информация находится на Visual C ++ Team Blog .
Это старое расширение для Visual Studio, единственной ссылкой, которую я смог найти на сайте Microsoft, был этот отчет об ошибке: Временные объекты могут быть привязаны к ссылкам не-Const , который имеет следующий пример кода :
struct A {};
A f1();
void f2(A&);
int main()
{
f2(f1()); // This line SHALL trigger an error, but it can be compiled without any errors or warnings.
}
Одна из комментариев:
Существует предупреждение уровня 4 (предупреждение уровня 4 включено, если вы передаете / W4 компилятору) для него
blockquote>Это сообщение в блоге: Visual C ++ настолько либеральна , которая охватывает это расширение:
Использование отключенных языковых расширений (/ Za) делает ошибку:
blockquote>