列中显示 2 个单独的结果

2 separate results displayed in columns

提问人:Peter Smith 提问时间:11/16/2023 最后编辑:egleasePeter Smith 更新时间:11/16/2023 访问量:56

问:

我是我的 SQL 初学者,我需要知道如何显示行数不同的 3 个查询的结果。他们将查询同一个表。示例表:

Scores
NAME    | SCORE
jack    |  1 
mike    |  3
kate    |  2
able    |  1
jill    |  2
seth    |  1

3 个 SINGLE SELECT 语句如下所示:

SELECT name as Ones
FROM scores
WHERE score = 1

SELECT name as Twos
FROM scores
WHERE score = 2

SELECT name as Threes
FROM scores
WHERE score = 3

每个查询的结果分别会给出不同的行计数,但我希望它们在列中,如下所示:

Ones     | Twos      | Threes
______________________________
jack     | mike      | kate 
able     | jill      |
seth     |           |

无论间隙中有空格还是空格,我都不会介意。

SQL 的MySQL

评论

0赞 jarlh 11/16/2023
哪个MySQL版本。(ROW_NUMBER窗口函数是在 8 中引入的。
0赞 Bagus Tesa 11/16/2023
如果你不介意的话,你可能想试试案例陈述jacktwosthreesnull
0赞 jarlh 11/16/2023
@BagusTesa,你是说 dev.mysql.com/doc/refman/8.0/en/......

答:

1赞 PippoZucca 11/16/2023 #1

由于您甚至可以接受空格或空值,因此您可以像这样使用 UNION ALL:

SELECT [name] as Ones, '' as Twos, '' as Threes FROM scores WHERE score = 1
union all
SELECT '' as Ones, [name] as Twos, '' as Threes FROM scores WHERE score = 2
union all
SELECT '' as Ones, '' as Twos, [name] as Threes FROM scores WHERE score = 3

以获得您要求的东西。 您只能将 union all 与具有相同结构的表一起使用,在本例中为 3 列,每列具有相同的名称。

最终结果是

Ones            Twos            Threes
------------    ------------    ------------
jack                                                                                                  
able                                                                                                  
seth                                                                                                  
                kate                                               
                jill                                               
                                mike

评论

0赞 jarlh 11/16/2023
我不确定MySQL是否接受方括号作为分隔符。反正根本不需要划定,不是保留的。(en.wikipedia.org/wiki/List_of_SQL_reserved_wordsname)
1赞 jarlh 11/16/2023 #2

用于每个分数类。row_number()

具有返回总行数的 cnt 派生表。

LEFT JOIN分数类。

select s1.ones, s2.twos, s3.threes
from
(select row_number() over () rn FROM scores) cnt
left join
  (SELECT name as ones, row_number() over () rn FROM scores WHERE score = 1) s1
  on cnt.rn = s1.rn
left outer join
(SELECT name as twos, row_number() over () rn FROM scores WHERE score = 2) s2
  on cnt.rn = s2.rn
left outer join
(SELECT name as threes, row_number() over () rn FROM scores WHERE score = 3) s3
  on cnt.rn = s3.rn
where s1.rn is not null or s2.rn is not null or s3.rn is not null

演示:https://dbfiddle.uk/CQiMcs6v

评论

0赞 Peter Smith 11/17/2023
谢谢,这非常有效,正是我需要的结果。