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更容易实现所需结果的方法),那就太棒了。
干杯
答案 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
中行内容的示例数据。这将需要更改为您的列内容。在PIVOT
和UNPIVOT
中,您无法使用查询来获取这些值,并且必须静态输入这些值。您可以使用动态SQL生成值,但这通常会被强烈建议