Sql 洗牌多行的列值
我在这里发布了一个类似的问题: p给出的查询ரதீப் 这是: 而1=1 开始 声明@answer SYSNAME=选择前1列的名称 从信息_SCHEMA.columns 其中TABLE_NAME='yourtable'和COLUMN_NAME不在'question','answer'中 纽伊德订购 DECLARE@distractor1 SYSNAME=选择前1列的名称 从信息_SCHEMA.columns 其中TABLE_NAME='yourtable'和COLUMN_NAME不在'question'中,@answer,'distractor1' 纽伊德订购 DECLARE@distractor2 SYSNAME=选择前1列的名称 从信息_SCHEMA.columns 其中TABLE_NAME='yourtable'和COLUMN_NAME不在'question'、@answer、'distractor2'、@distractor1中 纽伊德订购 DECLARE@distractor3 SYSNAME=选择前1列的名称 从信息_SCHEMA.columns 其中TABLE_NAME='yourtable'和COLUMN_NAME不在'question'、@answer、'distractor3'、@distractor2、@distractor1中 纽伊德订购 如果@distractor1不为NULL 并且@distractor2不为空 并且@distractor3不为空 并且@answer不是空的 打破 终止 -选择@distractor1、@distractor2、@distractor3 执行'update yourtable set-answer='+@answer+',Districtor1='+@Districtor1+',Districtor2='+@Districtor2+',Districtor3='+@Districtor3'Sql 洗牌多行的列值,sql,sql-server,Sql,Sql Server,我在这里发布了一个类似的问题: p给出的查询ரதீப் 这是: 而1=1 开始 声明@answer SYSNAME=选择前1列的名称 从信息_SCHEMA.columns 其中TABLE_NAME='yourtable'和COLUMN_NAME不在'question','answer'中 纽伊德订购 DECLARE@distractor1 SYSNAME=选择前1列的名称 从信息_SCHEMA.columns 其中TABLE_NAME='yourtable'和COLUMN_NAME不在'qu
从表中选择*问题的根源是非规范化的数据结构。您应该将答案存储在问题的单独表格中,这样可以更容易地随机排列答案的顺序
-- sample data
declare @questions table (
question varchar(10),
answer varchar(10),
distractor1 varchar(10),
distractor2 varchar(10),
distractor3 varchar(10)
)
insert @questions
select 'q1','a1','d11','d12','d13'
union all select 'q2','a2','d21','d22','d23'
union all select 'q3','a3','d31','d32','d33'
select results.*, q.answer
from
(
select question, response, row_number() over (partition by question order by newid()) rn
from
(
select question, answerType, response
from @questions
unpivot (answerType for response in (distractor1, distractor2, distractor3)) u
union all
select question, 'answer', answer as answerorder from @questions
) normalised -- the answers in a normalised form
) randomised -- randomise the order
pivot (max(response) for rn in ([1],[2],[3],[4])) results
inner join @questions q on results.question = q.question
你的问题有点宽泛,很难回答。答案有点长,但这里是: 1准备表-首先,您已经准备好了,这是源表,但我们还需要目标表。毕竟,您可以清除旧表并用新表中的值填充:
create table #Q_and_A(
question char(2),
answer varchar(5),
distractor1 varchar(5),
distractor2 varchar(5),
distractor3 varchar(5)
)
create table #Q_and_A_shuffled(
question char(2),
answer varchar(5),
distractor1 varchar(5),
distractor2 varchar(5),
distractor3 varchar(5)
)
insert into #Q_and_A values
('q1','ansq1', 'd1q1', 'd2q1', 'd3q1'),
('q2','ansq2', 'd1q2', 'd2q2', 'd3q2'),
('q3','ansq3', 'd1q3', 'd2q3', 'd3q3')
2有了这些,我们可以从一些程序开始,根据您的需要进行洗牌。为了做到这一点,我们需要所有列的名称组合,所以我们要做这样的事情:
declare @ColumnCombination table (col varchar(20))
insert into @ColumnCombination values ('answer'),('distractor1'),('distractor2'),('distractor3')
现在,查询:
select top 1 @insertQuery = 'insert into #Q_and_A_shuffled select question,' + Combinations + ' from #Q_and_A where question = ''' + @qst + '''' from (
select CC1.col + ',' + CC2.col + ',' + CC3.col + ',' + CC4.col Combinations from @ColumnCombination CC1
cross join @ColumnCombination CC2 cross join @ColumnCombination CC3 cross join @ColumnCombination CC4
where CC1.col <> CC2.col and CC1.col <> CC3.col and CC1.col <> CC4.col and
CC2.col <> CC3.col and CC2.col <> CC4.col and CC3.col <> CC4.col
) as a order by newid()
示例结果:
这里有一种方法 它与podiluska的答案类似,但更简单,因为它只适用于随机化、取消激励和旋转到当前行中的值
UPDATE YourTable
SET answer = CA.[1],
distractor1 = CA.[2],
distractor2 = CA.[3],
distractor3 = CA.[4]
FROM YourTable
CROSS APPLY (SELECT *
FROM (SELECT x,
ROW_NUMBER() OVER (ORDER BY CRYPT_GEN_RANDOM(4)) AS rn
FROM (VALUES(answer),
(distractor1),
(distractor2),
(distractor3)) V(x)) ps
PIVOT (MAX(x) FOR rn IN ([1], [2], [3], [4])) p) CA
注意:我假设你正在寻找一个基于你之前链接的问题的更新声明。如果需要选择,只需替换更新表即可
用SELECT QUEST设置,-我遇到一个错误列名或提供的值的数量与表定义不匹配。在本例中,我有一个名为items_original Q_和_a的表。它有以下列:itemID、subjectID、personID、问题、答案、干扰物1、干扰物2、干扰物3
UPDATE YourTable
SET answer = CA.[1],
distractor1 = CA.[2],
distractor2 = CA.[3],
distractor3 = CA.[4]
FROM YourTable
CROSS APPLY (SELECT *
FROM (SELECT x,
ROW_NUMBER() OVER (ORDER BY CRYPT_GEN_RANDOM(4)) AS rn
FROM (VALUES(answer),
(distractor1),
(distractor2),
(distractor3)) V(x)) ps
PIVOT (MAX(x) FOR rn IN ([1], [2], [3], [4])) p) CA