首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同的列中将多个结果元组显示为一个元组

在不同的列中将多个结果元组显示为一个元组
EN

Stack Overflow用户
提问于 2016-10-13 15:36:58
回答 2查看 325关注 0票数 0

原始数据库模式--

代码语言:javascript
复制
   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+

所需输出与选择查询

代码语言:javascript
复制
 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+

备注->基本上我希望列名“用户名”用于使多行用户“哈里亚纳邦”成为具有多列多行的单元组。

EN

回答 2

Stack Overflow用户

发布于 2016-10-13 16:19:46

关系数据库软件很难创建结果集(表),其中列的数目或名称取决于其他表中的数据。这就是你想要的。编写代码很困难,维护起来几乎是不可能的。即使您让它在SQL中工作,它也将是一个糟糕的黑客™。在你之后工作的人会诅咒你。

这类事情通常称为枢轴,最好在数据库客户端软件中完成。

话虽如此,也许你可以试试 aggregation function

这里有一个可能的查询。

代码语言:javascript
复制
SELECT GROUP_CONCAT(CONCAT_WS(' ', username,date, Grade) ORDER BY date SEPARATOR ' | ')
  FROM table
 GROUP BY username

它将给出这样的结果集:

代码语言:javascript
复制
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或任何其他语言进行少量的字符串处理可以转换这种结果,从而呈现出表中存在的错觉。

票数 1
EN

Stack Overflow用户

发布于 2016-10-13 17:14:33

我并不是认真地主张这是一种解决方案(见Ollie的第一句话,或我上面的评论)。所以只是为了好玩..。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40025337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档