1

次のようなテーブルがあります。

emp_id | code   | min  
1234   | TLPAID | 480  
4321   | TLPAID | 480  
4321   | UPAB   | 4  
4321   | UUAB   | 50  
5555   | TLPAID | 480  
5555   | ALLEUP | 10  

...何百もの可能なコードがありますが、そのうちの 6 つを合計して、10 未満かどうかを確認することに興味があります。

質問があります:

SELECT emp_id, sum(min) as time, SEC_TO_TIME(sum(min)*60) as time_formatted 
FROM codes 
WHERE code IN ('ALLEPD',  'ALLEUP',  'LATEBL',  'NCNS',  'UPAB',  'UUAB') 
GROUP BY emp_id HAVING time < 10 

このクエリは、従業員がこれら 6 つのコードのいずれも持っていない場合を除き、うまく機能します。その場合、それらは明らかに返されません。それが私の問題です: 時間が 0 で 10 未満であるため、それらを結果に含める必要があります。

さて、従業員は常に code を持っているTLPAIDので、上記の 6 にそのコードを含める方法があるかどうか疑問に思っていました (従業員がクエリ結果に含まれる方法) が、それでもそれらの 6 を合計するだけですか?

望ましい結果:

emp_id | min  
1234   | 0  
4321   | 54  
5555   | 10  

これにどのようにアプローチすべきかについて何か考えはありますか?

4

5 に答える 5

1

次のように、それらを個別に結合する場合があります。

SELECT emp_id, sum(min) as time, SEC_TO_TIME(sum(min)*60) as time_formatted FROM codes WHERE code IN ('ALLEPD',  'ALLEUP',  'LATEBL',  'NCNS',  'UPAB',  'UUAB') GROUP BY emp_id HAVING time < 10 

UNION

SELECT emp_id, 0 as time, 0 as time_formatted FROM codes WHERE code NOT IN ('ALLEPD',  'ALLEUP',  'LATEBL',  'NCNS',  'UPAB',  'UUAB') GROUP BY emp_id 
于 2013-08-14T19:29:09.353 に答える
0

元のテーブルとの左の結合を現在のクエリで実行します。これにより、一致しない列の戻り null 値が識別され、null がゼロに変換されます。これにより、クエリは一致しないレコードのゼロを自動的に合計し、他の一致した結果が現在のクエリ結果になります。. PFB コード

SELECT e.emp_id , IFNULL(SUM(c.min),0) AS time , SEC_TO_TIME(IFNULL(SUM(c.min),0)*60) AS time_formatted FROM (SELECT d.emp_id FROM コード d GROUP BY d. emp_id) e LEFT JOIN コード c ON c.emp_id = e.emp_id AND c.code IN ('ALLEPD', 'ALLEUP', 'LATEBL', 'NCNS', 'UPAB', 'UUAB') GROUP BY e.emp_id HAVING time < 10

于 2013-08-14T19:42:39.653 に答える
0

私はおそらく spencer7593 が提供する結合ソリューションを好むでしょうが、とにかく別のアプローチを示したかったのです。

SELECT 
    `emp_id`,
    SUM(CASE WHEN `code` IN('ALLEPD','ALLEUP','LATEBL','NCNS','UPAB','UUAB') 
        THEN COALESCE(`min`, 0) 
        ELSE 0 END) as `time`, 
    SEC_TO_TIME(SUM(`min`)*60) as `time_formatted` 
FROM `codes`
GROUP BY `emp_id`;

出力:

emp_id  time    time_formatted
1234    0       08:00:00
4321    54      08:54:00
5555    10      08:10:00

以下を使用して初期化された mysql データベースでテスト済み:

DROP DATABASE IF EXISTS `SO`;
CREATE DATABASE `SO`;
USE `SO`;

CREATE TABLE `codes` (
    `emp_id` INT,
    `code` VARCHAR(8),
    `min` int
);

INSERT INTO codes (`emp_id` , `code` , `min`)
VALUES
 (1234 , 'TLPAID' , 480)
,(4321 , 'TLPAID' , 480)
,(4321 , 'UPAB' , 4)
,(4321 , 'UUAB' , 50)
,(5555 , 'TLPAID' , 480)
,(5555 , 'ALLEUP' , 10);
于 2013-08-14T20:00:44.090 に答える