Sid*_*d M 2 sql-server-2008 sql-server
我有一张桌子 Columns
以及Response保存所有数据的第二个表。
现在我想创建一个 SQL 视图,其中的结果应该是这样的
我尝试使用枢轴
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;
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用,我也提到了这个/sf/ask/1102152971/但无法实现它。任何想法如何在 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)
Run Code Online (Sandbox Code Playgroud)
您没有解释为什么您的 PIVOT 查询对您不起作用,尽管通常不难猜测您的Response样本是否足以代表该表中的数据。您对用户 2 有两组响应,但您的查询仅选择一组。
由于您的预期输出显示您希望查询返回两组,您需要教它区分同一用户的不同组答案。一种方法是使用 ROW_NUMBER 分析函数:
SELECT
UserId,
FromDate,
ToDate,
Project,
Comment
FROM
(
SELECT
r.UserId,
r.Text,
c.ColumnName,
SetNo = ROW_NUMBER() OVER (PARTITION BY r.UserId, r.ColumnId ORDER BY r.Id)
FROM
dbo.Columns AS c
INNER JOIN dbo.Response AS r ON c.Id = r.ColumnId
) AS derived
PIVOT
(
MAX(Text)
FOR ColumnName IN (FromDate, ToDate, Project, Comment)
) AS p
;
Run Code Online (Sandbox Code Playgroud)
上面的查询做了一些假设:
Id),或者至少,如果一个FromDate响应晚于另一个FromDate响应,则其相关ToDate响应也晚于ToDate与前一个 相关的响应FromDate。如果真实数据中存在特殊情况(例如某些集合可能不完整),则可能需要不同的方法。
| 归档时间: |
|
| 查看次数: |
19015 次 |
| 最近记录: |