简体   繁体   English

SQL Server 2008:数据透视查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM