【问题标题】:SQL Pivot with multiple joins具有多个联接的 SQL Pivot
【发布时间】:2017-05-31 08:53:43
【问题描述】:

SQL Pivot 命令至少看起来很难。我已经阅读了很多关于它的内容,并且一直在修改这个查询一段时间,但我得到的只是无济于事的晦涩错误消息,例如“列名'Id'被多次指定......”或"无法绑定多部分标识符 X。"

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

我要转置的表格大致如下:

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 更简单的方法来达到预期结果),那就太好了。

干杯

【问题讨论】:

  • 你期待什么结果?
  • 在编写查询以透视数据时,请按全名引用列。例如,[问题].[Id]、[UserSessionData].[ID] 等

标签: sql-server pivot


【解决方案1】:

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

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

'quest' 和 'voyage' 是列SessionCode 中行内容的示例数据。这将需要更改为您的列内容。在PIVOTs 和UNPIVOTs 中,您不能使用查询来获取这些值,它们必须静态输入。您可以使用动态 SQL 来生成值,但通常强烈建议不要这样做

【讨论】:

  • 太棒了,非常感谢。我有类似的地方,但我不明白我必须用什么来替换“任务”和“航程”术语?例如,我希望用 MIN(ResponseTime) 填充“quest”列,这是我在上面的示例中省略的 [UserSessionData] 中的列。另外,我可以在哪里向 UserSessionData SELECT 添加 WHERE 子句以过滤掉一些行?
  • 你为什么在你的问题中省略了它? WHERE 子句将进入内部查询(表连接在一起的地方)。你能准确地用你想要的来更新你的问题,而不是让我在黑暗中四处乱窜吗?
  • 对不起,伙计。更新。再次感谢您的帮助!
  • 再次非常感谢 - 这大部分满足了我的要求,但是我仍然需要某种聚合以确保所有 UserSessionData 都按客户端显示(所以只有一行每个用户)。这是最初的问题,但也许我不是很清楚。
  • 如果没有示例数据,很难掌握您真正想要实现的目标。如果您上传了一些示例数据(输入和输出),有人可能会为您提供帮助。 Upload your setup to here and post the link
猜你喜欢
  • 1970-01-01
  • 2011-03-15
  • 2012-10-15
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多