首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Cursors+union+pivot进行查询?

使用Cursors+union+pivot进行查询?
EN

Stack Overflow用户
提问于 2012-10-01 23:39:37
回答 1查看 2K关注 0票数 2

我已经尝试了一段时间来解决这个问题,但没有成功。我有两张桌子:

1)问题

代码语言:javascript
复制
ID (pk)
QUES
ORD

2)答案

代码语言:javascript
复制
ID (pk)
QUES_ID (fk)
SURV_ID (fk)
ANSW

现在我需要创建一个视图,其中的问题是列名,并且对于每个SURV_ID,如果ANSWERS中没有条目,则在视图中有一行answer NULL;如果ANSWERS中有条目,则ANSWERS中有一行。不确定是否可以使用JOIN完成此操作。

我在考虑使用游标,然后对结果表进行联合,然后使用PIVOT,但不确定这是最好的解决方案+我不知道如何通过循环进行联合...

代码语言:javascript
复制
DECLARE @survID int
DECLARE db_cursor CURSOR FOR
SELECT DISTINCT SURV_ID FROM ANSWERS ORDER BY SURV_ID
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @survID

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT QUES
,ANSW , SURV_ID
FROM QUESTIONS a
left outer JOIN ANSWERS b ON a.ID = b.QUES_ID
WHERE ( SURV_ID = @survID OR SURV_ID IS NULL)
FETCH NEXT FROM db_cursor INTO @survID
END
CLOSE db_cursor
DEALLOCATE db_cursor

……

更新:我面临的问题有点复杂,因为并不是所有的问题都有答案(在这种情况下,我很乐意显示为空),并且答案是通过SURV_ID分组的

代码语言:javascript
复制
CREATE TABLE [QUESTIONS] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [QUES] [varchar](250) NOT NULL,
    [ORD] [int] NOT NULL,
CONSTRAINT [PK_QUESTIONS] 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 [QUESTIONS] values ('First Question', 1)
INSERT INTO [QUESTIONS] values ('Second Question', 2)

GO

CREATE TABLE [ANSWERS] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SURV_ID] [int] NOT NULL,
    [QUES_ID] [int] NOT NULL,
    [ANSW] [varchar](500) NOT NULL,
CONSTRAINT [PK_ANSWERS] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [ANSWERS]  WITH CHECK ADD  CONSTRAINT [FK_ANSWERS_QUESTIONS] FOREIGN KEY([QUES_ID])
REFERENCES [QUESTIONS] ([ID])
GO

ALTER TABLE [ANSWERS]   CHECK CONSTRAINT [FK_ANSWERS_QUESTIONS]
GO


INSERT INTO [ANSWERS] ([SURV_ID],[QUES_ID],[ANSW]) VALUES (1,1,'Y')
INSERT INTO [ANSWERS] ([SURV_ID],[QUES_ID],[ANSW]) VALUES (1,2,'N')
INSERT INTO [ANSWERS] ([SURV_ID],[QUES_ID],[ANSW]) VALUES (2,1,'N')
INSERT INTO [ANSWERS] ([SURV_ID],[QUES_ID],[ANSW]) VALUES (3,2,'Y')
INSERT INTO [ANSWERS] ([SURV_ID],[QUES_ID],[ANSW]) VALUES (4,1,'Y')
INSERT INTO [ANSWERS] ([SURV_ID],[QUES_ID],[ANSW]) VALUES (4,2,'Y')
GO

我想要得到的是,类似于

代码语言:javascript
复制
[SURV_ID]          [First Question]          [Second Question]  
1                  Y                         N  
2                  N                         null  
3                  null                      Y  
4                  Y                         Y
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-01 23:50:14

看起来您是在SQL-Server中工作,所以下面的代码应该可以工作。如果您知道要转换的项数,则可以对这些值进行硬编码:

代码语言:javascript
复制
select *
from
(
  select a.surv_id,
    a.answ,
    q.ques
  from QUESTIONS q
  left join ANSWERS a
    on q.ID = a.QUES_ID
) x
pivot
(
  max(answ)
  for ques in ([First Question], [Second Question])
) p

请参阅SQL Fiddle With Demo

如果您不知道列数,则可以使用动态sql:

代码语言:javascript
复制
DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT distinct  ',' 
                      + quotename(ques)
                    from QUESTIONS 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
  = 'select *
     from 
     (
        select a.surv_id,
          a.answ,
          q.ques
        from QUESTIONS q
        left join ANSWERS a
          on q.ID = a.QUES_ID
      ) x
      pivot
      (
        max(answ) 
        for ques in ('+ @colspivot +')
      ) p'

exec(@query)

请参阅SQL Fiddle with Demo

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12676482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档