Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 洗牌多行的列值_Sql_Sql Server - Fatal编程技术网

Sql 洗牌多行的列值

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

我在这里发布了一个类似的问题:

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'
从表中选择*问题的根源是非规范化的数据结构。您应该将答案存储在问题的单独表格中,这样可以更容易地随机排列答案的顺序

-- 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