Mysql 如何使用SQL创建新的重组数据表?
如何使用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
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
行号()(按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
行号()(按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语句。