【问题标题】:How to use the dynamically generated column in the same query without using join or cte如何在不使用 join 或 cte 的情况下在同一查询中使用动态生成的列
【发布时间】:2020-09-21 19:00:52
【问题描述】:

我正在学习 SQL。我有一种情况,我必须使用我在运行时创建的同一列。该表是 患者,只有 2 列,分别是 dateOfCheckupduration 以分钟为单位。

+---------------+-----------------+
| dateOfCheckup |   duration      | 
+---------------+-----------------+
|   2020-05-28  |  30 min         | 
|   2020-05-29  |  30 min         |
|   2020-05-30  |  1 hour         | 
|   2020-06-03  |  1 hour 30 min  | 
|   2020-06-05  |  30 min         |
|   2020-07-21  |  1 hour         |
|   2020-07-22  |  1 hour 30 min  | 
|   2020-07-28  |  1 hour 30 min  | 
+---------------+-----------------+

现在我将在运行时再创建 1 列,即 minutes(只是将 duration 转换为整数值的总分钟数):

select dateOfCheckup, duration,
((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) + (case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)) as minutes from patient;

此查询运行良好。查看结果:

+---------------+-----------------+-----------------+
| dateOfCheckup |  duration       |   minutes       |
+---------------+-----------------+-----------------+
|   2020-05-28  |  30 min         |   30            | 
|   2020-05-29  |  30 min         |   30            |
|   2020-05-30  |  1 hour         |   60            |
|   2020-06-03  |  1 hour 30 min  |   90            |
|   2020-06-05  |  30 min         |   30            |
|   2020-07-21  |  1 hour         |   60            |
|   2020-07-22  |  1 hour 30 min  |   90            |
|   2020-07-28  |  1 hour 30 min  |   90            |
+---------------+-----------------+-----------------+

我的问题是,如果我想在同一个查询中使用这个新创建的列 minutes 来处理其他任务,例如 group by、order by、sum、avg 等。我只是询问是否有这样的场景,那么我们如何实现这一点。我尝试使用sum(minutes)。错误是:

“字段列表”中的未知列“分钟”

这是db<>fiddle。请帮帮我。

【问题讨论】:

  • 你希望输出是什么?
  • 例如,在另一列中设为分钟+10。
  • 提供了下面的解决方案,如果对你有用的话

标签: mysql sql subquery


【解决方案1】:

您必须将当前查询视为子查询,然后对结果求和

SELECT SUM(minutes) AS total_time 
FROM (
    select dateOfCheckup, duration, 
    ((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) + 
    (case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)
    ) as minutes 
from patient
) AS a;

【讨论】:

    【解决方案2】:

    您不能在同一查询的另一个表达式中使用列别名。

    在子查询中定义别名,以便您可以在外部查询中引用它们:

    SELECT t.dateOfCheckup, SUM(t.minutes)
    FROM (
        select dateOfCheckup, duration,
          (
           (case when duration like '% hour%' 
                 then substring_index(duration, ' hour', 1) * 60 
                 else 0 end) 
         + (case when duration like '%min%' 
                 then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 
                 else 0 end)
          ) as minutes 
        from patient
    ) AS t
    GROUP BY t.dateOfCheckup
    

    【讨论】:

    【解决方案3】:

    我不知道你想做什么确切的操作,但使用一级子查询你可以以任何你想要的方式使用这个新的派生列,例如

    select dateOfCheckup,duration,max(minutes) over() maxminutes
      from (select dateOfCheckup, duration, ((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) + (case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)) as minutes 
              from patient
           ) p;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-22
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2011-08-24
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多