0

以下のSQLを使用しています。column1、column2 は 122.5014 および 4.2857 のような出力を提供します。しかし、私は48.9266を期待していましたが、出力NULLを与える最後の列。

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
4

1 に答える 1

0

ユーザー変数の出力は、集計関数で計算してから式で使用すると予測できません。したがって、クエリは機能しませんでした。

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)

したがって、最初にクエリを calculate に変更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
于 2014-05-26T12:52:49.410 に答える