Прежде всего вам нужен запрос, который генерирует серийные даты между двумя датами, которые будут источником имен столбцов для динамического стержня. Во-вторых, поскольку вам нужно 0 для нулевых значений, для каждого динамического столбца необходимо выполнить проверку ISNULL.
Проверьте следующие решения
DECLARE @startDate date = '2014-09-20'
DECLARE @endDate date = '2014-09-25'
DECLARE @sql NVARCHAR(MAX)
DECLARE @dates NVARCHAR(MAX)
-- to add ISNULL(columnName,0) to return 0 if null
DECLARE @nullChecks NVARCHAR(MAX)
--CTE for generating serial dates
;WITH Dates([Date])
AS
(
--Start with the first date
SELECT @startDate
UNION ALL
-- Loop by joining the CTE Dates, until the date < @endDate
SELECT DATEADD(DD,1,Dates.[Date])
FROM Dates
WHERE Dates.[Date] < @endDate
)
SELECT @dates = COALESCE(@dates + '],[', '') + CAST([Date] AS VARCHAR(10)),
@nullChecks = COALESCE(@nullChecks + 'ISNULL([', '') +
CAST([Date] AS VARCHAR(10)) + '],0) AS ['+CAST([Date] AS VARCHAR(10))+'] ,'
FROM Dates
--Append ISNULL condition in the beginnig
SET @nullChecks = 'ISNULL([' + SUBSTRING(@nullChecks,1,LEN(@nullChecks)-1)
SET @sql ='
SELECT sman_name,' + @nullChecks + ' FROM yourTableName
PIVOT
(
SUM(amt) FOR [date] IN ([' + @dates + '])
) As P;'
PRINT @sql
EXEC sp_executesql @sql
Какие базы данных вы используете? –
sql server 2008 – Indrah