当前查询 :
SELECT order_id AS OrderNumber, ordName, ordLastName, question, answer
FROM cart_survey
JOIN orders
ON cart_survey.order_id=orders.ordID
JOIN survey_answers
ON survey_answers.id=cart_survey.answer_id
JOIN survey_questions
ON survey_questions.id=cart_survey.question_id
结果 :
OrderNumber ordName ordLastName question answer
8591 Larry Marshburn Type of Surgery: Colostomy
8591 Larry Marshburn Month of Surgery: 2
8591 Larry Marshburn Year of surgery: 2010
8591 Larry Marshburn Current Ostomy System Brand: ConvaTec
8591 Larry Marshburn Degree of Satisfaction: Somewhat Satisfied
8593 Melvin Belcher Type of Surgery: Urostomy
8593 Melvin Belcher Month of Surgery: 9
8593 Melvin Belcher Year of surgery: 2010
8593 Melvin Belcher Current Ostomy System Brand: ConvaTec
8593 Melvin Belcher Degree of Satisfaction: Very Satisfied
如何正确查询表来拉动的结果会是这样? 名字和姓氏在单行和问题为每列列和答案。
期望的结果
OrderNumber ordName ordLastName "Type of Surgery" "Month of Surgery" "Year of Surgery" etc.
8591 Larry Marshbourn Colostomy 2 2010
8593 Melvin Belcher Urostomy 9 2010
张贴的答案工作,但笨拙和缓慢的。 你可以做我称之为平行聚集:
SELECT
ID,
SUM(case when question_id = 1 then 1 else 0 end) as sum1,
SUM(case when question_id = 2 then 1 else 0 end) as sum2,
SUM(case when question_id = 3 then 1 else 0 end) as sum3
GROUP BY ID
这将做一个传过来的表,而不是三个,是非常短的。 这是不是一个完整的步行通过,但你一定能适应的概念,您的需求。
这就是所谓的支点,其中行的信息来确定列的列表。 这种查询的需要,如果在查询完全完成动态计算的SQL,通常更适合于客户端的格式,而不是(许多工具称之为枢纽或交叉表查询,SSRS称之为矩阵查询)。
这就是所谓的PIVOT
有两种方法与静态版或动态版本执行此操作。
静态版本是当你硬编码值成为列:
SELECT *
FROM
(
SELECT order_id AS OrderNumber, ordName, ordLastName, question, answer
FROM cart_survey
JOIN orders
ON cart_survey.order_id=orders.ordID
JOIN survey_answers
ON survey_answers.id=cart_survey.answer_id
JOIN survey_questions
ON survey_questions.id=cart_survey.question_id
) x
pivot
(
min(answer)
for question in ([Type of Surgery:], [Month of Surgery:],
[Year of surgery:], [Current Ostomy System Brand:],
[Degree of Satisfaction:])
) p
动态透视,获取在运行时的列的列表:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ', ' + QUOTENAME(question)
from survey_questions
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT OrderNumber, ordname, orderLastName,' + @cols + ' from
(
SELECT order_id AS OrderNumber, ordName, ordLastName, question, answer
FROM cart_survey
JOIN orders
ON cart_survey.order_id=orders.ordID
JOIN survey_answers
ON survey_answers.id=cart_survey.answer_id
JOIN survey_questions
ON survey_questions.id=cart_survey.question_id
) x
pivot
(
min(answer)
for question in (' + @cols + ')
) p '
execute(@query)
这是MySQL版本
SELECT o . * ,
q1.answer AS 'Type of Surgery:',
q2.answer AS 'Month of Surgery:',
q3.answer AS 'Year of Surgery:',
q4.answer AS 'Current Brand:',
q5.answer AS 'Degree of Satisfaction:'
FROM (
SELECT DISTINCT ordID, ordName, ordLastName
FROM orders
)o
LEFT JOIN (
SELECT cs.order_id, a.answer
FROM cart_survey cs
LEFT JOIN survey_answers a ON cs.answer_id = a.id
WHERE cs.question_id =18
)q1 ON o.ordID = q1.order_id
LEFT JOIN (
SELECT cs.order_id, a.answer
FROM cart_survey cs
LEFT JOIN survey_answers a ON cs.answer_id = a.id
WHERE cs.question_id =19
)q2 ON o.ordID = q2.order_id
LEFT JOIN (
SELECT cs.order_id, a.answer
FROM cart_survey cs
LEFT JOIN survey_answers a ON cs.answer_id = a.id
WHERE cs.question_id =20
)q3 ON o.ordID = q3.order_id
LEFT JOIN (
SELECT cs.order_id, a.answer
FROM cart_survey cs
LEFT JOIN survey_answers a ON cs.answer_id = a.id
WHERE cs.question_id =21
)q4 ON o.ordID = q4.order_id
LEFT JOIN (
SELECT cs.order_id, a.answer
FROM cart_survey cs
LEFT JOIN survey_answers a ON cs.answer_id = a.id
WHERE cs.question_id =22
)q5 ON o.ordID = q5.order_id
这是MSSQL版
select o.*, q1.[Type of Surgery:], q2.[Month of Surgery:], q3.[Year of surgery:]
, q4.[Current Ostomy System Brand:]
, q5.[Degree of Satisfaction with the fit and comfort of your Current Ostomy System:]
from (
select distinct ordID, ordName + ' ' + ordLastName as [name] from dbo.Orders
) o
left join (
select *, a.[Answer] as [Type of Surgery:] from cart_survey cs
left join dbo.survey_answers a on cs.answer_id = a.id
where cs.question_id = 1
) q1 on o.ordID = q1.[order_id]
left join (
select *, a.[Answer] as [Month of Surgery:] from cart_survey cs
left join dbo.survey_answers a on cs.answer_id = a.id
where cs.question_id = 2
) q2 on o.ordID = q2.[order_id]
left join (
select *, a.[Answer] as [Year of surgery:] from cart_survey cs
left join dbo.survey_answers a on cs.answer_id = a.id
where cs.question_id = 3
) q3 on o.ordID = q3.[order_id]
left join (
select *, a.[Answer] as [Current Brand:] from cart_survey cs
left join dbo.survey_answers a on cs.answer_id = a.id
where cs.question_id = 4
) q4 on o.ordID = q4.[order_id]
left join (
select *, a.[Answer] as [Degree of Satisfaction:] from cart_survey cs
left join dbo.survey_answers a on cs.answer_id = a.id
where cs.question_id = 5
) q5 on o.ordID = q5.[order_id]
文章来源: Poor Man's SQL Pivot. List Questions as Columns and Answers per User in one row