从动态行号创建动态列名称

时间:2013-09-03 18:24:28

标签: sql sql-server tsql

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

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

尝试研究这个并且我已经做到了这一点。

我想要的是RowNumber是动态的,基于两个因素RecId,GroupedDataId。

没有对我正在做的事情进行调整。我希望这个简单的例子能说明一点。

因素角色数未知。 RecId可以有多个GroupedDataIds。 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分组。我希望订单会这样做,但它没有

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

任何帮助都将非常感谢...我花了一整天的时间让自己达到这一点,我的数据看起来像上面的例子

谢谢:)

2 个答案:

答案 0 :(得分: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 with Demo

答案 1 :(得分: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