我有一个类似于此的SQL表设置:
name | subject |
-------+----------+
Harry | Painting |
Sandra | Soccer |
Sandra | English |
如果有多个主题,我怎么能写一个合并行的select语句,所以它会输出如下结果:
name | subject 1 | subject 2 |
-------+------------+------------+
Harry | Painting | |
Sandra | Soccer | English |
答案 0 :(得分:0)
你不应该。最好的方法是加入表格,以便:
然后用脚本语言(PHP等)处理这些行,将其转换为您想要的分层数据结构
在上面的例子中,当每人有3个科目,10,100等时会发生什么。
SQL仅适用于二维数据。对于三维,您需要按照我的建议进行预处理/后处理,或者转移到NoSQL mongoDB,处理结构化对象而不是表行。
答案 1 :(得分:0)
由于您提到最大主题数仅为2,因此您可以为每个名称生成一个序号,并用它来旋转列。
SELECT Name,
MAX(CASE WHEN rn = 1 THEN Subject END) Subject1,
MAX(CASE WHEN rn = 2 THEN Subject END) Subject2
FROM
(
SELECT A.name,
A.subject,
(
SELECT COUNT(*)
FROM tableName c
WHERE c.name = a.name AND
c.subject <= a.subject) AS rn
FROM TableName a
) aa
GROUP BY Name
以上是SQL
方式。
答案 2 :(得分:0)
您需要PIVOT
例行程序。在您选择的引擎中为此进行搜索。
有些RDBMS内置了这个。在CASE
子句中有一个使用SELECT
语句的替代方法,其中有很多博客文章。
答案 3 :(得分:0)
您可以使用substring_index()
和group_concat()
this (SQLfiddle)
SELECT DISTINCT s.name,
substring_index(p.subject_list, ',', 1) AS "subject_1",
IF(instr(p.subject_list, ','),
substring_index(p.subject_list, ',', -1),
NULL
) AS "subject_2"
FROM subjects s
JOIN (SELECT name, GROUP_CONCAT(subject) AS "subject_list"
FROM subjects
GROUP BY name
) p on p.name = s.name
;