原始数据库模式--
id username date Grade
----------------------------------------
1 Haryana 15/02/2001 A
2 Haryana 20/02/2008 B+
3 Punjab 15/05/2001 A
4 Haryana 25/02/2008 A
5 Punjab 25/02/2008 B+所需输出与选择查询
username date Grade username date Grade username date Grade
-------------------------------------------------------------------------------------------
haryana 15/02/2001 A Haryana 20/02/2008 B+ Haryana 25/02/2008 A
Punjab 15/05/2001 A Punjab 25/02/2008 B+备注->基本上我希望列名“用户名”用于使多行用户“哈里亚纳邦”成为具有多列多行的单元组。
发布于 2016-10-13 16:19:46
关系数据库软件很难创建结果集(表),其中列的数目或名称取决于其他表中的数据。这就是你想要的。编写代码很困难,维护起来几乎是不可能的。即使您让它在SQL中工作,它也将是一个糟糕的黑客™。在你之后工作的人会诅咒你。
这类事情通常称为枢轴,最好在数据库客户端软件中完成。
话虽如此,也许你可以试试 aggregation function。
这里有一个可能的查询。
SELECT GROUP_CONCAT(CONCAT_WS(' ', username,date, Grade) ORDER BY date SEPARATOR ' | ')
FROM table
GROUP BY username它将给出这样的结果集:
Haryana 15/02/2001 A | Haryana 20/02/2008 B+ | Haryana 25/02/2008 A
Punjab 15/05/2001 A | Punjab 25/02/2008 B+使用php或任何其他语言进行少量的字符串处理可以转换这种结果,从而呈现出表中存在的错觉。
发布于 2016-10-13 17:14:33
我并不是认真地主张这是一种解决方案(见Ollie的第一句话,或我上面的评论)。所以只是为了好玩..。
SELECT username
, MAX(CASE WHEN rank = 1 THEN date END) date1
, MAX(CASE WHEN rank = 1 THEN grade END) grade1
, MAX(CASE WHEN rank = 2 THEN date END) date2
, MAX(CASE WHEN rank = 2 THEN grade END) grade2
, MAX(CASE WHEN rank = 3 THEN date END) date3
, MAX(CASE WHEN rank = 3 THEN grade END) grade3
FROM
(
SELECT x.*
, CASE WHEN @prev = username THEN @i:=@i+1 ELSE @i:=1 END rank
, @prev:=username
FROM my_table x
,(SELECT @prev:=null,@i:=0) vars
ORDER
BY username
, date
) a
GROUP
BY username;https://stackoverflow.com/questions/40025337
复制相似问题