2014-12-09 3 views
-1

У меня есть таблица с указанной ниже схемой:Как использовать ISNULL или COALESCE функции при использовании PIVOT в MS SQL

InvoiceID int PK, 
Date datetime, 
Amount Money 

теперь я создать таблицу, которая содержит год, месяц и Сумму из таблицы выше.

Year | Month | Amount 
2014 | Dec | 10 

Я затем поворачивайте эту таблицу все месяцы

select * from (select year(Date) as InvoiceYear, isnull(left(datename(month, date),3),0) as InvoiceMonth, Amount from Invoice) as Sid pivot (sum(Amount) for InvoiceMonth in (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec)) as P1 

У меня есть проблема в том, что мне нужно установить месяцы, которые не имеют каких-либо сумм к нулю, а не нулевой

+0

Какие РСУБД? Большинство из них имеют функцию NVL для преобразования NULL в заданное значение. –

+0

@ Mr.Llama: Я использую MS SQL 2008 – Sid

+0

Вы ищете SUM (ISNULL (Amount, 0)) – Jt2ouan

ответ

1

Если у вас есть месяц без счета-фактуры, он всегда будет генерировать нулевое значение для суммы в этом месяце при повороте таблицы.

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

SELECT 
invoiceYear, 
isnull(jan,0) as [jan], 
isnull(feb,0) as [feb], 
etc... 
FROM 
(select * from 
(select year(Date) as InvoiceYear, 
isnull(left(datename(month, date),3),0) as InvoiceMonth, 
Amount from Invoice) 
as Sid 
pivot (sum(Amount) for InvoiceMonth in (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec)) as P1 
) A 
GROUP BY invoiceYear