带日期列的动态数据透视表

时间:2019-05-01 19:46:15

标签: sql sql-server

我有一个表,其中提供了有关某项物品的库存信息。

这是表格的样子:

ITEMCODE  DATE        INSTOCK
-----------------------------
ABC001    2019-01-04    10
ABC001    2019-02-04    10
ABC001    2019-03-04    10
ABC001    2019-04-04     5
ABC001    2019-05-04     5

是否有可能获得这样的输出:

Itemcode   01/04/2019    02/04/2019  03/04/2019  04/04/2019   05/04/2019
-------------------------------------------------------------------------    
ABC001        10             10         10           5             5

这是我使用过的查询...

SELECT T0.ITEMCODE,T0.INSTOCK 
FROM DBO.TABLE_2 T0
WHERE T0.DATE >='[%0]'AND T0.DATE <= '[%1]'

但是经过一些研究,我发现了使用数据透视表的可能性...

如何修改查询以获取所需的输出

1 个答案:

答案 0 :(得分:2)

我可以使用下面的代码来获取它,您只需将#table替换为表名。还要忽略设置表的代码的第一部分。

此处有类似的问题/答案:SQL Server dynamic PIVOT query?

-------------------------------------------------------------------
IF OBJECT_ID('tempdb..#table') IS NOT  NULL
BEGIN
    DROP TABLE #table
END

CREATE TABLE #table(ITEMCODE VARCHAR(10),DATE date,INSTOCK int)

insert into #table values('ABC001','2019-01-04',10)
insert into #table values('ABC001','2019-02-04',10)
insert into #table values('ABC001','2019-03-04',10)
insert into #table values('ABC001','2019-04-04',5)
insert into #table values('ABC001','2019-05-04',5)
-------------------------------------------------------------------

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.DATE) 
            FROM #table c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ITEMCODE, ' + @cols + ' from 
            (
                select ITEMCODE
                    , DATE
                    , INSTOCK
                from #table
           ) x
            pivot 
            (
                 sum(INSTOCK)
                for DATE in (' + @cols + ')
            ) p '


execute(@query)