【问题标题】:pivot dynamic number rows into columns without grouping [duplicate]将动态数字行旋转到不分组的列中[重复]
【发布时间】:2019-07-19 16:19:15
【问题描述】:

我有一个task 表,其中包含以下记录:

id  |  client_id  |  user_id  |  designation_id   |  total_hours
-----------------------------------------------------------------
1   |  14         |  134      |  1                |  4
2   |  14         |  135      |  2                |  1
3   |  15         |  136      |  3                |  3
4   |  16         |  137      |  4                |  4.5

还有designation表:

id  |  title
------------------------
1   | Cloud Analyst
2   | Data Analyst
3   | Data QA Analyst
4   | Project Manager
.
.

指定记录是动态的,因此我不想对它们进行硬编码。

我正在尝试获得以下输出:

client  |  user  |  Cloud Analyst  |  Data Analyst  |  Data QA Analyst  |  Project Manager
-------------------------------------------------------------------------------------------
14      |  134   |  4              |                |                   |          
14      |  135   |                 |  1             |                   |
15      |  136   |                 |                |   3               |
16      |  137   |                 |                |                   |   4.5

言辞:

  • 除了client_idtask 表中的designation_id 列之外,将所有可用的名称(来自名称表)列出为columns
  • total_hours 值应放置在相应的 designation 列下,即,如果用户是 cloud analyst(通过 designation_id),则其 hours 值应位于 cloud analyst 列下。

这是我尝试做的:

SELECT t.client_id, t.user_id, 
(case  
       when d.id = t.designation_id then t.total_hours 
       else '' 
       end as d.title)
FROM task t
INNER JOIN designations d
on d.id = t.designation_id
ORDER BY client_id ASC

如何实现输出?

【问题讨论】:

    标签: mysql sql pivot case


    【解决方案1】:

    如果您需要枢轴,您可以使用几种情况(或如果)

    SELECT t.client_id
        , t.user_id
        , case when t.designation_id = 1 then t.total_hours else null end `Cloud Analyst` 
        , case when t.designation_id = 2 then t.total_hours else null end `Data Analyst` 
        , case when t.designation_id = 3 then t.total_hours else null end `Data QA Analyst` 
        , case when t.designation_id = 4 then t.total_hours else null end `Project Manager` 
    from  task t 
    order by  client_id ASC
    

    【讨论】:

    • 我已经更新了关于动态指定行的帖子,因此想要对它们进行硬编码。
    • mysql 没有动态枢轴的功能.. 如果您需要动态解决方案,您必须在服务器端工作以构建动态 sql 或在表示级别管理情况..
    【解决方案2】:
    SELECT t.client_id
         , t.user_id
         , d.title
         , t.total_hours 
      FROM task t 
      JOIN designation d 
        ON d.id = t.designation_id;
    +-----------+---------+-----------------+-------------+
    | client_id | user_id | title           | total_hours |
    +-----------+---------+-----------------+-------------+
    |        14 |     134 | Cloud Analyst   |        4.00 |
    |        14 |     135 | Data Analyst    |        1.00 |
    |        15 |     136 | Data QA Analyst |        3.00 |
    |        16 |     137 | Project Manager |        4.50 |
    +-----------+---------+-----------------+-------------+
    

    这个问题的其余部分最好在应用程序代码中解决

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 2021-05-18
      • 2020-11-03
      相关资源
      最近更新 更多