2016-11-18 72 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可以有更多行。我正在根據你的數據。 –