2

关于我 我不是 SQL DBA 程序员。我假装是一个。因此,在设计复杂查询时,我是初学者/中间人,具体取决于它是什么。

到目前为止,这就是我想出的一个例子,向你展示我喜欢做什么。

尝试对此进行研究,我已经做到了这一点。

我想要的是基于两个因素 RecId、GroupedDataId 的动态行号。

没有陷入我正在做的事情。我希望这个简单的例子足以说明这一点。

因素 角色数量未知。RecId 可以有多个 GroupedDataId。GroupedDataIds 只能有一条记录。

所需输出

PCRID,GROuPedDataId, AnswerText, Question
1   1   Driver, Driver  ROLE1
1   2   Driver, Driver  ROLE2
1   33  Driver, Driver  ROLE3
2   48  Driver, Driver  ROLE1
2   55  Driver, Driver  ROLE2
3   32  Driver, Driver  ROLE1
3   33  Driver, Driver  ROLE2
4   109 Driver, Driver  ROLE1

创建的示例

Create Table #example
(
 RecId int,
 GroupedDataId int,
 Question varChar(50),
 AnswerText varchar(100)
)
INSERT INTO #example (RecId, GroupedDataId, Question, AnswerText)
SELECT 1, 1, 'ROLE', 'Driver, Driver'
UNION
SELECT 1, 2, 'ROLE', 'Driver, Driver'
UNION
SELECT 1, 33, 'ROLE', 'Driver, Driver'
UNION
SELECT 2, 55, 'ROLE', 'Driver, Driver'
UNION
SELECT 2, 48, 'ROLE', 'Driver, Driver'
UNION
SELECT 3, 32, 'ROLE', 'Driver, Driver'
UNION<BR>
SELECT 3, 33, 'ROLE', 'Driver, Driver'
UNION
SELECT 4, 109, 'ROLE', 'Driver, Driver'

SELECT RecId
, GroupedDataId
, AnswerText
, Question = 'ROLE' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT RecId), (SELECT GroupedDataId)) AS VARCHAR(max))
FROM #example

DROP TABLE #example
<P>

这就是我得到的。请注意,角色# 不会在新的 RecId,GroupedDataId 分组上重新开始。我希望order by会这样做,但它没有

PCRID,GROuPedDataId, AnswerText, Question
1       1   Driver, Driver  ROLE1
1   2   Driver, Driver  ROLE2
1   33  Driver, Driver  ROLE3
2   48  Driver, Driver  ROLE4
2   55  Driver, Driver  ROLE5
3   32  Driver, Driver  ROLE6
3   33  Driver, Driver  ROLE7
4   109 Driver, Driver  ROLE8

任何帮助将不胜感激......我花了一整天的时间让自己达到我的数据看起来像上面的例子的地步。

谢谢 :)

4

2 回答 2

1

您当前的查询非常接近,您缺少partition by窗口row_number()功能。这将允许每次recId更改时将数字重置为 1:

SELECT RecId
  , GroupedDataId
  , AnswerText
  , Question = 'ROLE' + CAST(ROW_NUMBER() OVER (partition by RecId
                                                 order by RecId, GroupedDataId) AS VARCHAR(max)) 
FROM example;

请参阅带有演示的 SQL Fiddle

于 2013-09-03T18:32:23.413 回答
1

尝试使用 ROW_NUMBER() 函数的 PARTITION 方法:

SELECT RecId
, GroupedDataId
, AnswerText
, Question = 'ROLE' + CAST(ROW_NUMBER() OVER (PARTITION BY RecID ORDER BY RecId, GroupedDataId) AS VARCHAR(max))
FROM #example
于 2013-09-03T18:34:05.267 回答