【问题标题】:MySQL Reused variable outputs NULLMySQL重用变量输出NULL
【发布时间】:2014-07-15 05:19:46
【问题描述】:

我正在使用以下 SQL。 column1、column2 给出的输出如 122.5014 和 4.2857;但是最后一列给出了输出 NULL 虽然我期待 48.9266

SQL 输入:


SELECT (

SELECT @h := ( SUM( (
TIME_TO_SEC( TIMEDIFF(  `stop` ,  `start` ) ) /3600 ) )
)
) AS  `HoursWorked` , (

SELECT @w := ( TIMESTAMPDIFF( 
DAY , MIN(  `start` ) , MAX(  `stop` ) ) /7 )
) AS  `InWeeks` , (

SELECT (
((@w *40) - ( @h ))
)
) AS  `DutyDistance` 
FROM  `work_table`

输出

HoursWorked | InWeeks | DutyDistance
------------------------------------
122.5014    | 4.2857  | NULL

【问题讨论】:

    标签: mysql sql variables null user-defined


    【解决方案1】:

    当使用聚合函数计算然后在表达式中使用时,用户变量的输出是不可预测的。因此,您的查询不起作用。

    示例

    mysql> create table tbl_so_q23870035( i int );
    Query OK, 0 rows affected (0.48 sec)
    
    mysql> insert into tbl_so_q23870035 values( 2 ), ( 4 ), ( 9 ), ( 6 ), ( 15 );
    Query OK, 5 rows affected (0.13 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    mysql> select @s:=sum(i) as s, @s*2 as s2 from tbl_so_q23870035;
    +------+------+
    | s    | s2   |
    +------+------+
    |   36 | NULL |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> select s, s*2 as s2
        ->   from ( 
        ->          select sum(i) as s from tbl_so_q23870035 
        ->   ) aggregated_data;
    +------+------+
    | s    | s2   |
    +------+------+
    |   36 |   72 |
    +------+------+
    1 row in set (0.00 sec)
    

    因此,您必须先更改查询以在内部查询中计算 HoursWorkedInWeeks,然后在外部查询中计算 DutyDistance。不需要用户变量。

    示例

    select `HoursWorked`, `InWeeks`, ( `InWeeks` * 40 - `HoursWorked` ) AS `DutyDistance` 
    from (
        select  SUM( TIME_TO_SEC( TIMEDIFF(  `stop`,  `start` ) ) / 3600 ) AS `HoursWorked`
             ,  TIMESTAMPDIFF( DAY , MIN(  `start` ), MAX(  `stop` ) ) / 7 AS `InWeeks` 
        FROM  `work_table`
    ) aggregated_data
    

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2013-11-23
      • 2016-01-13
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多