SQL将行中的不同项转换为列

SQL将行中的不同项转换为列,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我有一张桌子 Date Item Quantity 20170101 Mango 5 20170101 Orange 6 20170102 Mango 7 20170102 Orange 8 我要低于输出 Date Mango Orange 20170101 5 6 20170102 7

我有一张桌子

Date          Item          Quantity
20170101      Mango         5
20170101      Orange        6
20170102      Mango         7
20170102      Orange        8
我要低于输出

Date        Mango       Orange
20170101    5           6
20170102    7           8
为此,我使用了下面的sql查询

SELECT 
   Date,
   SUM(case when Item='Mango' then Quantity else 0 end) AS Mango,
   SUM(case when Item='Orange' then Quantity else 0 end) AS Orange
FROM orderTable
GROUP BY date
但这是芒果和橙子的硬编码。如果我需要orderTable中的新项目怎么办。有人能建议我如何使这个查询动态化吗。所以,若我添加新的项目,它会自动创建新的coulmn,项目名称作为名称,并且当该项目未下订单时,它在日期列下的值为0

那么输出应该是

Date        Mango       Orange    Cherry
20170101    5           6         0
20170102    7           8         9
输出

Date        Cherry  Mango   Orange
----------------------------------
20170101     0       5       6
20170102     9       7       8
结果:

Date        Cherry  Mango   Orange
20170101    0       5       6
20170102    9       7       8
参考(代码pic未显示,但如果您查看源代码页面,则可以访问该代码): 试试这个:

CREATE TABLE [dbo].[test](
    [Date] [int] NULL,
    [Item] [nvarchar](50) NULL,
    [Quantity] [int] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170101, N'Mango', 5)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170101, N'Orange', 6)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170102, N'Mango', 7)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170102, N'Orange', 8)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170102, N'Cherry', 5)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170103, N'Cherry', 2)
GO
动态sql:

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

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Item) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT DATE, ' + @cols + N' from 
             (
                select Date,Item, Quantity from test
            ) x
            pivot 
            (
                max(Quantity)
                for Item in (' + @cols + N')
            ) p '

exec sp_executesql @query;
结果:

DATE       Cherry   Mango   Orange
20170101    NULL    5       6
20170102    5       7       8
20170103    2      NULL     NULL

如果你这样做,它会给你你想要的结果

所以如果一个苹果突然出现在表中,你想要另一列吗?您使用的是哪种dbms?是的,MS SQL Server尝试使用pivot函数
CREATE TABLE [dbo].[test](
    [Date] [int] NULL,
    [Item] [nvarchar](50) NULL,
    [Quantity] [int] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170101, N'Mango', 5)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170101, N'Orange', 6)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170102, N'Mango', 7)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170102, N'Orange', 8)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170102, N'Cherry', 5)
GO
INSERT [dbo].[test] ([Date], [Item], [Quantity]) VALUES (20170103, N'Cherry', 2)
GO
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Item) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT DATE, ' + @cols + N' from 
             (
                select Date,Item, Quantity from test
            ) x
            pivot 
            (
                max(Quantity)
                for Item in (' + @cols + N')
            ) p '

exec sp_executesql @query;
DATE       Cherry   Mango   Orange
20170101    NULL    5       6
20170102    5       7       8
20170103    2      NULL     NULL
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Item) 
            FROM dbo.OrderTable c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT DateOrdered, ' + @cols + ' from 
            (
                select Item, DateOrdered, Quantity
                from dbo.OrderTable
           ) x
            pivot 
            (
                 Sum(Quantity)
                for Item in (' + @cols + ')
            ) p '
execute(@query)