【问题标题】:Concat rows with the same user连接具有相同用户的行
【发布时间】:2017-08-03 21:45:02
【问题描述】:

我有疑问:

SELECT e.id_taxe
     , u.nm_user
     , dt_taxe
     , SUM(e.vl_taxe) as vl_taxe
FROM taxe as e 
  JOIN user as u 
    ON u.id_user = e.id_user 
WHERE id_enterprise = 86 
   AND dt_taxe BETWEEN '2017-01-01' AND '2017-03-31'
   AND lg_cancel = 0 
 GROUP 
    BY e.dt_taxe
     , e.id_user 
 ORDER 
    BY e.id_user
     , e.dt_taxe

结果,我有:

id_taxe     nm_user   dt_taxe      vl_taxe
728         Maria     2017-01-01   17091.07048034668
727         Maria     2017-02-01   14091.07048034668
721         Maria     2017-03-01   1021.07048034668
731         Pedro     2017-01-01   16353.569854736328
732         Pedro     2017-02-01   6353.56231239

如何连接行以获得结果:

id_taxe     nm_user   dt_taxe      vl_taxe
728         Maria     2017-01-01   17091.07048034668 , 
                      2017-02-01   14091.07048034668,
                      2017-03-01   1021.07048034668
731         Pedro     2017-01-01   16353.569854736328,
                      2017-02-01   6353.56231239

【问题讨论】:

  • 您想如何确定要显示的 ID_Taxe?是与最低 DT_Taxe 关联的 ID_Taxe 吗?
  • 考虑处理应用级代码中数据显示的问题

标签: mysql sql group-concat


【解决方案1】:

对于像 PostgreSQL 这样的数据库,这可以通过窗口函数来完成,但 MySQL 不支持窗口函数,所以你不能这样做

【讨论】:

    【解决方案2】:

    这种类型的操作通常最好在应用层完成。您的结果集不是很 SQLish,因为排序非常很重要。

    但是,您可以使用变量来做到这一点:

    SELECT (CASE WHEN rn = 1 THEN id_taxe END) as id_taxe,
           (CASE WHEN rn = 1 THEN nm_user END) as num_user,
           dt_taxe, vl_taxe
    FROM (SELECT eu.*,
                 (@rn := if(@u = e.id_user, @rn + 1,
                            if(@u := e.id_user, 1, 1)
                           )
                 ) as rn
          FROM (SELECT e.id_taxe, u.nm_user, e.dt_taxe, SUM(e.vl_taxe) as vl_taxe
                FROM taxe e INNER JOIN
                     user u 
                     ON u.id_user = e.id_user 
                WHERE id_enterprise = 86 AND
                      dt_taxe BETWEEN '2017-01-01' AND '2017-03-31' AND
                      lg_cancel = 0
                GROUP BY e.dt_taxe, e.id_user
               ) eu CROSS JOIN
               (SELECT @i := -1, @rn := 0)
          ORDER BY id_user, dt_taxe
         ) eu;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多