带有多个连接的SQL Pivot

时间:2017-05-31 08:53:44

标签: sql-server pivot

SQL Pivot命令至少看起来很困难。我已经阅读了很多关于它的内容,并且暂时修补了这个问题,但我得到的是非常模糊的错误信息,这些信息并没有帮助,例如"列名称' ID'被多次指定.."或"多部分标识符X无法绑定。"

我们的数据库收集客户对问题的答案。我想创建一个表,其中包含每个客户端的行,以及他们已经回答的每个问题(ID)的列以及用户已登录的所有时间的AVG ResponseTime。这使得更加困难因为UserId没有直接存储在UserSessionData表中,所以它存储在UserSession表中,所以我必须先进行连接,这似乎使问题复杂化。

我尝试转动的表大致采用以下形式:

CREATE TABLE [dbo].[UserSessionData](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserSessionId] [int] NOT NULL,
[UserWasCorrect] [bit] NULL,
[ResponseTime] [float] NULL,
[QuestionId] [int] NULL)
--This table contains user answers to a number of questions.

CREATE TABLE [dbo].[UserSession](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[SessionCode] [nvarchar](50) NOT NULL)
--This table contains details of the user's login session.

CREATE TABLE [dbo].[Question](
[Id] [int] IDENTITY(1,1) NOT NULL,
[QuestionText] [nvarchar](max) NOT NULL,
[GameId] [int] NOT NULL,
[Description] [nvarchar](max) NULL)
--This table contains question details

我会继续尝试破解解决方案,但是如果有人能够解决问题(或建议比PIVOT更容易实现所需结果的方法),那就太棒了。

干杯

1 个答案:

答案 0 :(得分:0)

这是因为您在多个表中拥有相同的列名,因此在您完成加入后,数据透视图会看到多个列具有相同的名称。看看下面的例子:

SELECT 
    *
FROM (
    SELECT
        usd.Id AS usdId
        ,UserSessionId
        ,UserWasCorrect
        ,ResponseTime
        ,QuestionId
        ,us.Id AS usId
        ,SessionCode
        ,UserId
        ,Description
        ,GameId
        ,qu.Id AS quId
        ,QuestionText
    FROM #UserSessionData usd
    LEFT JOIN #UserSession us
    ON usd.UserSessionId = us.Id
    LEFT JOIN #Question qu
    ON usd.QuestionId = qu.Id
) AS tbl PIVOT (
    -- As no example data was provided 'quest' & 'voyage are just random values I put in. Change the pivot statement to match what you want
    MIN(ResponseTime) FOR SessionCode IN (quest, voyage)
) AS pvt

'任务'和' voyage'是列SessionCode中行内容的示例数据。这将需要更改为您的列内容。在PIVOTUNPIVOT中,您无法使用查询来获取这些值,并且必须静态输入这些值。您可以使用动态SQL生成值,但这通常会被强烈建议