如何使用SQL Server枢

问题描述:

我的用户表如何使用SQL Server枢

CREATE TABLE [dbo].[User] 
(
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Username] [varchar](255) NULL, 
    [Password] [varchar](255) NULL, 
    [RegisterDate] [smalldatetime] NULL 
) ON [PRIMARY] 
GO 

我的日志表

CREATE TABLE [dbo].[LogForLogin] 
(
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [UserId] [int] NULL, 
    [Login] [smalldatetime] NULL 
) ON [PRIMARY] 
GO 

我需要这样的:

RegisterDate | 14.06.2017 | 15.06.2017 | 16.06.2017 | 
-------------+------------+------------+------------+ 
14.06.2017 | 7   | 5   | 3 
15.06.2017 | 4   | 9   | 4 
16.06.2017 | 3   | 7   | 6 

列名需要是动态的。我希望注册日期的条目是并排的。

我想这一点:

Select * from (
    Select RegisterDate, [Login] from dbo.[User] 
     INNER JOIN dbo.[LogForLogin] 
     On [LogUserServerLogin].UserId = [User].Id ) a 
pivot (count([Login]) for RegisterDate in ([14.06.2017], [15.06.2017], [16.06.2017])) p 

BU给人一种错误:

Msg 8114, Level 16, State 1, Line 5 
Error converting data type nvarchar to smalldatetime. 
Msg 473, Level 16, State 1, Line 5 
The incorrect value "14.06.2017" is supplied in the PIVOT operator. 
+0

添加[User]表格 – 2017-06-16 13:58:45

+0

的样本数据,以便为行名称和登录日期注册日期? – Greenspark

+0

是的,会的。 – muslumcollu

可以使用旋转如下:

Select * from (
    Select u.RegisterDate, l.[Login] from dbo.[User] u 
     INNER JOIN dbo.[LogForLogin] l 
     On u.Id = l.UserId ) a 
    pivot (count(l.[Login]) for u.RegisterDate in ([14.06.2017], [15.06.2017], [16.06.2017])) p 

您可以尝试动态查询作为如下:

declare @cols1 varchar(max) 
declare @query nvarchar(max) 

Select @cols1 = stuff((select distinct ','+QuoteName(RegisterDate) from [User] for xml path('')),1,1,'') 

Set @Query = ' Select * from (
    Select u.RegisterDate, l.[Login] from dbo.[User] u 
     INNER JOIN dbo.[LogForLogin] l 
     On u.Id = l.UserId ) a 
    pivot (count(l.[Login]) for u.RegisterDate in (' + @cols1 + ')) p ' 

exec sp_executeSql @Query 
+0

我试图从这个 选择*( 选择u.RegisterDate湖[登录]从DBO。[用户]ù INNER JOIN DBO。[LogForLogin]升 在u.Id = l.UserId)一([14.06.2017],[15.06.2017],[16.06.2017]))p 但给出错误: Msg 107,Level 15对于u.RegisterDate的计数(l。[Login] ,状态1,行5 列前缀'l'与查询中使用的表名或别名不匹配。 消息107,级别15,状态1,行5 列前缀'u'与查询中使用的表名或别名不匹配。 – muslumcollu

+0

在数据透视期间提供“count(a.login)”而不是“count(l.login)” –