2016-11-18 71 views
3

我有一个表Columns如何行转换为列在SQL

enter image description here

,并在所有的数据保存在第二台Response

enter image description here

现在我想创建一个SQL视图中的结果应该是这样的

enter image description here

我尝试使用透视

select UserId ,FromDate, ToDate, Project, Comment 
from 
(
    select R.UserId ,R.Text , C.ColumnName 
    from [Columns] C 
    INNER JOIN Response R ON C.Id=R.ColumnId 
) d 
pivot 
(
    max(Text) 
    for ColumnName in (FromDate, ToDate, Project, Comment) 
) piv; 

,但没有为我工作,我也提到这Efficiently convert rows to columns in sql server,但无法实现它。任何想法如何在SQL视图中实现相同?

脚本为表:

CREATE TABLE [dbo].[Columns](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](1000) NULL, 
    [IsActive] [bit] NULL, 
CONSTRAINT [PK_Columns] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

insert into [Columns] values('FromDate',1) 
insert into [Columns] values('ToDate',1) 
insert into [Columns] values('Project',1) 
insert into [Columns] values('Comment',1) 

CREATE TABLE [dbo].[Response](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [UserId] [bigint] NOT NULL, 
    [ColumnId] [bigint] NOT NULL, 
    [Text] [nvarchar](max) NULL, 
    [IsActive] [bit] NULL, 
    CONSTRAINT [PK_Response] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
insert into [Response] values(1,1,'1/1/2012',1) 
insert into [Response] values(1,2,'1/2/2012',1) 
insert into [Response] values(1,3,'p1',1) 
insert into [Response] values(1,4,'c1',1) 
insert into [Response] values(2,1,'1/1/2013',1) 
insert into [Response] values(2,2,'1/2/2013',1) 
insert into [Response] values(2,3,'p2',1) 
insert into [Response] values(2,4,'c2',1) 
insert into [Response] values(2,1,'1/1/2014',1) 
insert into [Response] values(2,2,'1/2/2014',1) 
insert into [Response] values(2,3,'p3',1) 
insert into [Response] values(2,4,'c3',1) 
insert into [Response] values(3,1,'1/1/2015',1) 
insert into [Response] values(3,2,'1/2/2015',1) 
insert into [Response] values(3,3,'p4',1) 
insert into [Response] values(3,4,'c4',1) 
+0

显示什么对你没用。 –

+0

@WEI_DBA:枢轴 –

+1

您可以显示您尝试使用的数据透视查询吗? –

回答

2

老实说,如果列类型不会改变,或者你只需​​要其中的一个子集,你可以只筛选出来,然后加入他们,而不是写一个支点。我使用cte编写它,但它们可能很容易被子查询:

;with fd as 
(
    select 
     UserID, 
     [Text] as FromDate, 
     row_number() over (partition by userID order by ID) as DEDUP 
    from response 
    where ColumnID = 1 
), 
td as 
(
    select 
     UserID, 
     [Text] as ToDate, 
     row_number() over (partition by userID order by ID) as DEDUP 
    from response 
    where ColumnID = 2 
), 
p as 
(
    select 
     UserID, 
     [Text] as Project, 
     row_number() over (partition by userID order by ID) as DEDUP 
    from response 
    where ColumnID = 3 
), 
c as 
(
    select 
     UserID, 
     [Text] as Comment, 
     row_number() over (partition by userID order by ID) as DEDUP 
    from response 
    where ColumnID = 4 
) 
select 
    fd.*, 
    td.ToDate, 
    p.Project, 
    c.Comment 
from fd 
    inner join td 
     on fd.UserId = td.UserId 
      and fd.DEDUP = td.DEDUP 
    inner join p 
     on fd.UserId = p.UserId 
      and fd.DEDUP = p.DEDUP 
    inner join c 
     on fd.UserId = c.UserId 
      and fd.DEDUP = c.DEDUP 
+0

您的查询返回重复记录,有没有什么办法可以获得唯一的记录。 –

+0

@SidM我修复了我的错误。让我知道如果这现在正常工作 – DForck42

+0

不,它仍然给重复的结果 –

-1

可以查询这样

;with cte as 
(
    select r.*, 
    c.name 
    from Response r 
     inner join Columns c 
      on r.columnid = c.id 
) 
select 
    Userid, 
    max([FromDate]) as [FromDate], 
    max([ToDate]) as [ToDate], 
    max([Project]) as [Project], 
    max([Comment]) as [Comment] 
from cte 
pivot 
(
    max(Text) for name in ([FromDate], [ToDate], [Project], [Comment]) 
) p 
group by userid 
+0

答案中存在2个问题,'1':'max'函数对'date'类型值返回null,这里是对'FromDate'和'Todate'列。 '2':只有1行返回'UserId = 2' –

+0

提供您的输入样本数据作为脚本 –

+0

共享脚本 –

0

试试这个。我努力解决你的问题。

select UserId ,FromDate, ToDate, Project, Comment 
from 
(
    select R.UserId ,R.RText , C.ColumnName 
    from [Columns] C 
    INNER JOIN Response R ON C.Id=R.ColumnId 
) d 
pivot 
(
    Min(Rtext) 
    for ColumnName in (FromDate, ToDate, Project, Comment) 
) piv 

UNION 
select UserId ,FromDate, ToDate, Project, Comment 
from 
(
    select R.UserId ,R.RText , C.ColumnName 
    from [Columns] C 
    INNER JOIN Response R ON C.Id=R.ColumnId 
) d 
pivot 
(
    Max(Rtext) 
    for ColumnName in (FromDate, ToDate, Project, Comment) 
) piv; 
+0

对于日期类型值,'max'和'min'函数返回null,这里是'FromDate'和'Todate'列。此外,您正在考虑仅用于UserId = 2的两行,对于任何UserId –

+0

True可以有更多行。我正在根据你的数据。 –