1

事前定義された日付(締め切り日)に基づいてレポートベースを生成しようとしています。インとアウト、残業の2つのテーブルがあります。

INおよびOUTテーブル

インテーブルとアウトテーブル

残業表

残業表

期待される結果

ここに画像の説明を入力してください

UNIONを使用すると、日付が2倍になりますが、おそらくgroup byで解決できますが、グループはUNIONでは機能しないようです。

そして、トリッキーな部分は、空白の1月6日と1月5日を表示することです。このcozにタイムシートレポートを表示する必要があります。

どんな助けや手がかりも大歓迎です

コード:

SELECT emp_id,in,out,null 
FROM normal 
WHERE date >= '1-Jan' 
  AND date <= '10-Jan' 
  AND emp_id = '10001'
UNION
SELECT emp_id,null,null,minutes 
FROM overtime 
WHERE date >= '1-Jan' 
  AND date <= '10-Jan' 
  AND emp_id = '10001'
4

1 に答える 1

1

このような何かがあなたが望むことをするはずです(私が質問を理解した場合):

SELECT n.date, n.emp_id, n.in, n.out, o.minutes
FROM normal n 
JOIN overtime o USING(emp_id)
WHERE n.date BETWEEN '2012-01-01' AND '2012-01-10'

一致する日付がない場合でも表示する場合は、この日付のリストを含むテーブルを作成する必要があることに注意してください。

日付

+------------+
| timestamp  |
|------------+
| 2012-01-01 |
| 2012-01-02 |
| ....       |

次に、この方法でクエリを変更して、必要な結果セットを取得できます。

SELECT d.timestamp AS date, b.emp_id, b.in, b.out, b.minutes
FROM dates d
LEFT JOIN 
(SELECT n.date AS timestamp, n.emp_id AS emp_id, n.in AS in, n.out AS out, o.minutes AS minutes
 FROM normal n 
 JOIN overtime o USING(emp_id)
 ) b 
 USING(timestamp)
 WHERE d.timestamp BETWEEN '2012-01-01' AND '2012-01-10'

日付テーブルを避けたい場合は、このより複雑なクエリで試すことができます。日付の範囲を格納する3番目のテーブルを必要とせずに、同じ結果が得られるはずです。

SELECT d.timestamp AS date, b.emp_id, b.in, b.out, b.minutes
FROM ( 
SELECT '2012-01-01' + INTERVAL a + b DAY AS timestamp
FROM
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
UNION SELECT 8 UNION SELECT 9 ) d,
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
UNION SELECT 30 UNION SELECT 40) m
WHERE '2012-01-01' + INTERVAL a + b DAY  <  '2012-01-11'
ORDER BY a + b
) d
LEFT JOIN 
(SELECT n.date AS timestamp, n.emp_id AS emp_id, n.in AS in, n.out AS out, o.minutes AS minutes
 FROM normal n 
 JOIN overtime o USING(emp_id)
 ) b 
 USING(timestamp)
于 2012-05-27T09:15:14.540 に答える