0

編集: 直接分と間接分を差し引いた全体の合計が必要です。

M. 分を別名「dminutes」として合計しようとしています。次に、もう一度 M.minutes の SUM を取り、「間接」列値を持つ M.minutes を減算します (そして、「inminutes」エイリアスを付けます)。ただし、null が表示されるため、構文が間違っています。提案?

table = tasks
column = task_type


Example:
M.minutes total = 60 minutes
M. minutes (with "direct" task_type column value) = 50 minutes (AS dminutes)
M. minutes (with "indirect" task_type column value) = 10 minutes (AS inminutes)

SQL ステートメント:

SELECT 
U.user_name,
SUM(M.minutes) as dminutes,
ROUND(SUM(M.minutes))-(SELECT (SUM(M.minutes)) from summary s WHERE ta.task_type='indirect') as inminutes
FROM summary S
JOIN users U ON U.user_id = S.user_id
JOIN tasks TA ON TA.task_id = S.task_id
JOIN minutes M ON M.minutes_id = S.minutes_id
WHERE DATE(submit_date) = curdate()
AND TIME(submit_date) BETWEEN '00:00:01' and '23:59:59'
GROUP BY U.user_name 
LIMIT 0 , 30
4

2 に答える 2

1

このようなものが機能するはずだと思います。

少し工夫する必要があるかもしれません。

SELECT direct.duser_id, indirect.iminutes, direct.dminutes, 
    direct.dminutes - indirect.iminutes FROM
    (SELECT U.user_id AS iuser_id, SUM(M.minutes) AS iminutes
    FROM summary S
    JOIN users U 
    ON U.user_id = S.user_id
    JOIN minutes M 
    ON M.minutes_id = S.minutes_id
    JOIN tasks TA 
    ON TA.task_id = S.task_id
    WHERE TA.task_type='indirect'
    AND DATE(submit_date) = curdate()
    AND TIME(submit_date) BETWEEN '00:00:01' and '23:59:59'
    GROUP BY U.user_id) AS indirect
JOIN
    (SELECT U.user_id AS duser_id, SUM(M.minutes) AS dminutes
    FROM summary S
    JOIN users U 
    ON U.user_id = S.user_id
    JOIN minutes M 
    ON M.minutes_id = S.minutes_id
    JOIN tasks TA 
    ON TA.task_id = S.task_id
    WHERE TA.task_type='direct'
    AND DATE(submit_date) = curdate()
    AND TIME(submit_date) BETWEEN '00:00:01' and '23:59:59'
    GROUP BY U.user_id) AS direct
WHERE indirect.iuser_id = direct.duser_id
于 2012-10-28T20:40:30.967 に答える
1

SUM厄介な小さな関数です:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum

expr の合計を返します。戻りセットに行がない場合、SUM() は NULL を返します。DISTINCT キーワードは、expr の個別の値のみを合計するために使用できます。

一致する行がない場合、SUM() は NULL を返します。

SUM を COALESCE または IFNULL にラップしてみてください。

... COALESCE( SUM(whatever), 0) ...
于 2012-10-28T20:43:05.710 に答える