[英]SQL Server 2008: Pivot query
I feel like I am close to solving the problem, but I can't get past this one issue. 我觉得我已经快要解决问题了,但我无法克服这一问题。 I have searched the forum and have come across some sources that have helped me get closer to what I am looking to do but now I am stuck: 我在论坛上进行了搜索,发现了一些资料,这些资料可以帮助我更进一步地了解自己要做什么,但现在我陷入了困境:
This is the original SQL I used to pull info from 3 tables: 这是我用来从3个表中提取信息的原始SQL:
SELECT tblAtoZ.nAtoZID, tblAtoZ.sName, tblAnsPickList.sListText Rating, tblAnsPickList.sListText Price
FROM tblAtoZ
INNER JOIN
tblAnswers ON tblAtoZ.nAtoZID = tblAnswers.nID
INNER JOIN
tblAnsPickList ON tblAnswers.sAnswer = CAST(tblAnsPickList.nListIndex AS varchar)
AND tblAnswers.nQuestionID = tblAnsPickList.nQuestionID
WHERE
tblAnswers.nQuestionID IN ('182','205') AND sCategory = 'Restaurant'
ORDER BY sName
That gets me the following result: 那给我以下结果:
nAtoZID sName Rating Price
3040 Rest 1 $$ - $30 to $40 $$ - $30 to $40
3040 Rest 1 3 Stars - Excellent 3 Stars - Excellent
3222 Rest 2 $ - $20 to $30 $ - $20 to $30
6996 Rest 3 $$ - $30 to $40 $$ - $30 to $40
4474 Rest 4 $$$ - $40 to $50 $$$ - $40 to $50
3385 Rest 5 $ - $20 to $30 $ - $20 to $30
8244 Rest 6 $ - $20 to $30 $ - $20 to $30
107 Rest 7 ¢¢ - Under $10 ¢¢ - Under $10
2661 Rest 8 $$$ - $40 to $50 $$$ - $40 to $50
2661 Rest 8 3 Stars - Excellent 3 Stars - Excellent
The Desired result is this: 所需的结果是这样的:
nAtoZID sName Rating Price
3040 Rest 1 3 Stars - Excellent $$ - $30 to $40
3222 Rest 2 Null $ - $20 to $30
6996 Rest 3 Null $$ - $30 to $40
4474 Rest 4 Null $$$ - $40 to $50
3385 Rest 5 Null $ - $20 to $30
8244 Rest 6 Null $ - $20 to $30
107 Rest 7 Null ¢¢ - Under $10
2661 Rest 8 3 Stars - Excellent $$$ - $40 to $50
I have tried different joins, pivot queries and even the old SQL Server 2000 method and I can't seem to get this right. 我尝试了不同的联接,数据透视查询,甚至是旧的SQL Server 2000方法,但我似乎都做不到。 I appreciate any direction / assistance. 我感谢任何指示/协助。 Thanks 谢谢
Try this 尝试这个
SELECT
tblAtoZ.nAtoZID
, tblAtoZ.sName
, MAX(CASE
WHEN tblAnsPickList.sListText = '3 Stars - Excellent'
THEN tblAnsPickList.sListText END) AS Rating
, MAX(CASE
WHEN tblAnsPickList.sListText <> '3 Stars - Excellent'
THEN tblAnsPickList.sListText END) AS Price
FROM tblAtoZ
INNER JOIN tblAnswers
ON tblAtoZ.nAtoZID = tblAnswers.nID
INNER JOIN tblAnsPickList
ON tblAnswers.sAnswer = CAST(tblAnsPickList.nListIndex AS varchar)
AND tblAnswers.nQuestionID = tblAnsPickList.nQuestionID
WHERE tblAnswers.nQuestionID IN ('182', '205')
AND sCategory = 'Restaurant'
GROUP BY
tblAtoZ.nAtoZID
, tblAtoZ.sName
ORDER BY
sName
With Pivot, you can do like below 使用Pivot,您可以执行以下操作
SELECT tblAtoZ.nAtoZID,
tblAtoZ.sName,
pivotTable.Rating,
pivotTable.Price
FROM tblAtoZ
INNER JOIN
(
select nId,
nListIndex,
[182] as Rating,
[205] as Price
from
(
select nID, nListIndex, sListText,
tblAnsPickList.nQuestionID
from tblAnsPickList
inner join tblAnswers ON
sAnswer = CAST(tblAnsPickList.nListIndex AS varchar)
and tblAnsPickList.nQuestionID IN ('182','205')
and tblAnsPickList.nQuestionID = tblAnswers.nQuestionID
) sourceTable
PIVOT (
max(sListText)
for nQuestionID IN ([182],[205])
) as P
) pivotTable
ON tblAtoZ.nAtoZID = pivotTable.nID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.