Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
Mysql 如何使用SQL创建新的重组数据表?_Mysql_Sql - Fatal编程技术网

Mysql 如何使用SQL创建新的重组数据表?

Mysql 如何使用SQL创建新的重组数据表?,mysql,sql,Mysql,Sql,如何使用SQL转换以下数据: cat score 1 2 1 3 2 1 2 3 2 5 3 1 3 2 3 3 3 4 要创建以下子集: cat score1 score2 1 2 3 2 1 3 3 1 2 因此,只有列“cat”中每个值的前两个分数将被放入转换表中。一种可能的方法是在cat上使用自连接,但a.score

如何使用SQL转换以下数据:

 cat    score
 1     2
 1     3
 2     1
 2     3
 2     5
 3     1
 3     2
 3     3
 3     4
要创建以下子集:

 cat score1 score2
 1    2     3
 2    1     3
 3    1     2

因此,只有列“cat”中每个值的前两个分数将被放入转换表中。

一种可能的方法是在cat上使用自连接,但a.score 这假设Score1-X总是您希望显示从最低到最高的分数。如果需要的话,我们也可以从最高点到最低点,或者我们可以使用规则来管理挑选的对象

演示:

或者(因为这提供了更好的n分数缩放方法)

演示:

它只需在外部select中添加一个case语句,就可以更优雅地处理n个分数

在本例中,我们通过使用两个用户变量并根据需要调整它们的值来模拟一个
行号()(按cat顺序划分,按cat,score)

通过单独运行此部分:

SELECT case when cat=@cat then @RN:=@RN+1 else @RN:=1 end RN
     , case when cat=@cat then @cat else @cat:=cat end cat
     , score
FROM (SELECT * FROM SO46102892 ORDER BY cat, score) A
CROSS JOIN (SELECT @RN:=0, @Cat:=0) z
您可以看到每个RN如何为每个类别分配1-x,模拟其他RDBMS中提供的行数功能

SELECT cat
     , max(case when RN = 1 then score end) as Score1
     , max(case when RN = 2 then score end) as Score2
     , max(case when RN = 3 then score end) as Score3
     , max(case when RN = 4 then score end) as Score4
     , max(case when RN = 5 then score end) as Score5
FROM (SELECT case when cat=@cat then @RN:=@RN+1 else @RN:=1 end RN
           , case when cat=@cat then @cat else @cat:=cat end cat
           , score
      FROM (SELECT * FROM SO46102892 ORDER BY cat, score) A
      CROSS JOIN (SELECT @RN:=0, @Cat:=0) z
      ) y
GROUP BY cat
ORDER BY cat;
给我们:

+----+-----+--------+--------+--------+--------+--------+
|    | cat | Score1 | Score2 | Score3 | Score4 | Score5 |
+----+-----+--------+--------+--------+--------+--------+
|  1 |   1 |      2 |      3 | NULL   | NULL   | NULL   |
|  2 |   2 |      1 |      3 | 5      | NULL   | NULL   |
|  3 |   3 |      1 |      2 | 3      | 4      | NULL   |
+----+-----+--------+--------+--------+--------+--------+

只需将分数3、4、5从外部选择中删除,我们就可以排除它。

一种可能的方法是在cat上使用自连接,但a.score 这假设Score1-X总是您希望显示从最低到最高的分数。如果需要的话,我们也可以从最高点到最低点,或者我们可以使用规则来管理挑选的对象

演示:

或者(因为这提供了更好的n分数缩放方法)

演示:

它只需在外部select中添加一个case语句,就可以更优雅地处理n个分数

在本例中,我们通过使用两个用户变量并根据需要调整它们的值来模拟一个
行号()(按cat顺序划分,按cat,score)

通过单独运行此部分:

SELECT case when cat=@cat then @RN:=@RN+1 else @RN:=1 end RN
     , case when cat=@cat then @cat else @cat:=cat end cat
     , score
FROM (SELECT * FROM SO46102892 ORDER BY cat, score) A
CROSS JOIN (SELECT @RN:=0, @Cat:=0) z
您可以看到每个RN如何为每个类别分配1-x,模拟其他RDBMS中提供的行数功能

SELECT cat
     , max(case when RN = 1 then score end) as Score1
     , max(case when RN = 2 then score end) as Score2
     , max(case when RN = 3 then score end) as Score3
     , max(case when RN = 4 then score end) as Score4
     , max(case when RN = 5 then score end) as Score5
FROM (SELECT case when cat=@cat then @RN:=@RN+1 else @RN:=1 end RN
           , case when cat=@cat then @cat else @cat:=cat end cat
           , score
      FROM (SELECT * FROM SO46102892 ORDER BY cat, score) A
      CROSS JOIN (SELECT @RN:=0, @Cat:=0) z
      ) y
GROUP BY cat
ORDER BY cat;
给我们:

+----+-----+--------+--------+--------+--------+--------+
|    | cat | Score1 | Score2 | Score3 | Score4 | Score5 |
+----+-----+--------+--------+--------+--------+--------+
|  1 |   1 |      2 |      3 | NULL   | NULL   | NULL   |
|  2 |   2 |      1 |      3 | 5      | NULL   | NULL   |
|  3 |   3 |      1 |      2 | 3      | 4      | NULL   |
+----+-----+--------+--------+--------+--------+--------+

我们可以通过从外部选择中删除分数3、4、5来排除它。

什么rdbms(SQL Server、MySQL等)我们如何知道哪个分数是分数1,哪个分数是分数2?小的总是得1分吗?或者这有关系吗?前两个分数是指最低的两个?我使用的是mySQL数据库。每个类别中只有前两个分数会被添加到转换中。什么rdbms(SQL Server、mySQL等)我们如何知道哪个分数是分数1,哪个分数是分数2?小的总是得1分吗?或者这有关系吗?前两个分数是指最低的两个?我使用的是mySQL数据库。每个类别中只有前两个分数会被添加到转换中。@SimonRH更新以消除备用答案子项中的额外case语句。@SimonRH更新以消除备用答案子项中的额外case语句。