Sql server SQL Server-Pivot的Pivot

Sql server SQL Server-Pivot的Pivot,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,我是SQL pivot查询的新手,并且一直停留在pivot结果的pivot中 我有一张名为ExampleSales的表。我想找到每月甚至每天,每周,每月,每年的员工和项目的明智销售。下面是表、示例数据和一级透视的示例 CREATE TABLE [dbo].[ExampleSales]( [SalesId] [int] IDENTITY(1,1) NOT NULL, [ItemCode] [varchar](50) NOT NULL, [EmployeeName] [var

我是SQL pivot查询的新手,并且一直停留在pivot结果的pivot中

我有一张名为ExampleSales的表。我想找到每月甚至每天,每周,每月,每年的员工和项目的明智销售。下面是表、示例数据和一级透视的示例

CREATE TABLE [dbo].[ExampleSales](
    [SalesId] [int] IDENTITY(1,1) NOT NULL,
    [ItemCode] [varchar](50) NOT NULL,
    [EmployeeName] [varchar](250) NOT NULL,
    [Amount] [decimal](18, 2) NOT NULL,
    [SalesDate] [datetime2](7) NOT NULL,
 CONSTRAINT [PK_ExampleSales] PRIMARY KEY CLUSTERED 
(
    [SalesId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
样本数据:

SET IDENTITY_INSERT [dbo].[ExampleSales] ON 

GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (1, N'A1', N'Michel John', CAST(120.00 AS Decimal(18, 2)), CAST(0x07207D922A5ADF3C0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (2, N'A1', N'Mark Ven', CAST(50.00 AS Decimal(18, 2)), CAST(0x07D07748385AF33C0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (3, N'A2', N'Michel John', CAST(50.00 AS Decimal(18, 2)), CAST(0x07F05983465A023D0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (4, N'A2', N'Mark Ven', CAST(150.00 AS Decimal(18, 2)), CAST(0x073054DF505AFD3C0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (5, N'A3', N'Michel John', CAST(23.00 AS Decimal(18, 2)), CAST(0x0730AC235F5ADF3C0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (6, N'A3', N'Mark Ven', CAST(56.00 AS Decimal(18, 2)), CAST(0x07F02161695AF33C0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (7, N'A4', N'Michel John', CAST(54.00 AS Decimal(18, 2)), CAST(0x07C09BB2825A023D0B AS DateTime2))
GO
INSERT [dbo].[ExampleSales] ([SalesId], [ItemCode], [EmployeeName], [Amount],  [SalesDate]) VALUES (8, N'A4', N'Mark Ven', CAST(100.00 AS Decimal(18, 2)), CAST(0x0750622E925ADB3C0B AS DateTime2))
GO
SET IDENTITY_INSERT [dbo].[ExampleSales] OFF
GO
第一级透视查询

SELECT
DateName( month , DateAdd( month , DATEPART(m,SalesDate)  , 0 ) - 1 ) AS 'month',EmployeeName,[A1] ,[A2],[A3],[A4]
    FROM
        (SELECT 
                Salesid,SalesDate,EmployeeName,ItemCode
         FROM 
                ExampleSales
        ) AS SourceTable
    PIVOT
    (
        COUNT(Salesid) 
        FOR ItemCode IN([A1] ,[A2],[A3],[A4])
    ) AS PivotTable
现在,我被困在这里。我想要下一个级别,如下所示


您可以按如下方式执行此操作:

select * from
(select salesid,datename(month,salesdate) as mn,concat(employeename,'(',itemcode,')') as items from examplesales
) as S
pivot
(
count(salesid)
for items in  ([Michel John(A1)],[Mark Ven(A1)],[Michel John(A2)],[Mark Ven(A2)],
                            [Michel John(A3)],[Mark Ven(A3)],[Michel John(A4)],[Mark Ven(A4)])
                            ) p
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(concat(c.employeename,'(',c.itemcode,')')) 
            FROM examplesales c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'select * from
(select salesid,datename(month,salesdate) as mn,concat(employeename,''('',itemcode,'')'') as items from examplesales
) as S
pivot
(
count(salesid)
for items in  ('+@cols+') ) p '


execute(@query)
结果是:

对于动态模式:

使用方法如下:

select * from
(select salesid,datename(month,salesdate) as mn,concat(employeename,'(',itemcode,')') as items from examplesales
) as S
pivot
(
count(salesid)
for items in  ([Michel John(A1)],[Mark Ven(A1)],[Michel John(A2)],[Mark Ven(A2)],
                            [Michel John(A3)],[Mark Ven(A3)],[Michel John(A4)],[Mark Ven(A4)])
                            ) p
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(concat(c.employeename,'(',c.itemcode,')')) 
            FROM examplesales c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'select * from
(select salesid,datename(month,salesdate) as mn,concat(employeename,''('',itemcode,'')'') as items from examplesales
) as S
pivot
(
count(salesid)
for items in  ('+@cols+') ) p '


execute(@query)

感谢Ranjana为我冗长的问题提供了非常简单的解决方案。只是想知道如何使这个列成为动态的。下面是一个使cols动态的好方法吗?声明@c为NVARCHARMAX,@q为NVARCHARMAX SET@c=STUFFSELECT distinct',“+QuoteNameContactEmployeeName,,itemcode,来自[dbo]。[examplesales]c用于XML路径,键入.value.”,@NVARCHARMAX',1,1,从选择salesid,datenamemonth,salesdate为mn,concatemployeename,,itemcode,作为examplesales as S pivot countsalesid中的项目,'+@c++'p'EXEC SP_EXECUTESQL@qHello@ChiragMehta中的项目,我已经对另一个动态答案进行了注释。