2014-09-26 6 views
0

Я пытаюсь понять, как написать динамический сводный sql-оператор. Мне нужно вычислить сумму datewise (АМТ) за продавцом, где берется дата между динамически занесены диапазонКак я могу развернуть эту таблицу

Вот мой стол .:

Источник Таблица

╔Sman_name date amt 

aaa  2014-09-20  100 

bbb  2014-09-22  200 

aaa  2014-09-20   150 

aaa  2014-09-22   200 

я должен получить следующий результат :

2014-09-20  2014-09-21 2014-09-22 

    aaa 250   0   200 
    bbb 0   0  200 

Как достичь этого с помощью сводного запроса? Спасибо за любую помощь.

+1

Какие базы данных вы используете? –

+0

sql server 2008 – Indrah

ответ

0

Прежде всего вам нужен запрос, который генерирует серийные даты между двумя датами, которые будут источником имен столбцов для динамического стержня. Во-вторых, поскольку вам нужно 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 
+0

tx alot:) ... очень хорошо объяснил ... :) – Indrah

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