2017-11-01 3 views
0

良い日、 すべての4人のユーザーの過去14日間のステータスデータを返すSQL文を作成しようとしています。 LEFT JOINを実行する目的でカレンダーテーブルを作成しました。 はBACKUPDATA表を与えられた:データがない日にMysqlを残しました

+----------+-------------+------------+-----------+------------------- 
--+ 
| customer | Category | user  | status | Date     
| 
+----------+-------------+------------+-----------+---------------------+ 
| acme  | Workstation | Judi  | [Success] | 2017-10-18 10:29:08 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-18 11:25:33 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-18 11:33:56 | 
| acme  | Workstation | Reception | [Success] | 2017-10-18 12:14:49 | 
| acme  | Workstation | Megan  | [Success] | 2017-10-18 16:10:24 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-18 16:11:03 | 
| acme  | Workstation | Reception | [Success] | 2017-10-19 08:04:15 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-19 11:35:47 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-19 16:10:13 | 
| acme  | Workstation | Reception | [Success] | 2017-10-20 08:35:26 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-20 13:28:08 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-20 16:09:00 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-21 11:33:28 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-21 16:11:01 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-22 11:33:16 | 
+----------+-------------+------------+-----------+---------------------+ 

は、私はこのようなデータを提示したい:データのない

+------------+------------+-----------+ 
| dt   | User  | Status | 
+------------+------------+-----------+ 
| 2017-10-18 | Judi  | [Success] | 
| 2017-10-18 | Megan  | [Success] | 
| 2017-10-18 | Quickbooks | [Success] | 
| 2017-10-18 | Reception | [Success] | 
| 2017-10-19 | Judi  | [Success] | 
| 2017-10-19 | Quickbooks | [Success] | 
| 2017-10-19 | Reception | [Success] | 
| 2017-10-19 | Megan  | No Data | 
| 2017-10-20 | Judi  | [Success] | 
| 2017-10-20 | Quickbooks | [Success] | 
| 2017-10-20 | Reception | [Success] | 
| 2017-10-20 | Megan  | No Data | 
| 2017-10-21 | Judi  | [Success] | 
| 2017-10-21 | Quickbooks | [Success] | 
| 2017-10-21 | Megan  | No Data | 
| 2017-10-21 | Reception | [Success] | 
| 2017-10-22 | Judi  | [Success] | 
| 2017-10-22 | Quickbooks | [Success] | 
| 2017-10-22 | Megan  | No Data | 
| 2017-10-22 | Reception | No Data | 
| 2017-10-23 | Judi  | [Success] | 
| 2017-10-23 | Reception | [Success] | 
| 2017-10-23 | Quickbooks | No Data | 
| 2017-10-23 | Megan  | No Data | 

日がユーザーのために、 "NO DATA" と表示しなければなりません。私が変更した場合は

+------------+------------+-----------+ 
| dt   | User  | Status | 
+------------+------------+-----------+ 
| 2017-10-18 | Judi  | [Success] | 
| 2017-10-18 | Megan  | [Success] | 
| 2017-10-18 | Quickbooks | [Success] | 
| 2017-10-18 | Reception | [Success] | 
| 2017-10-19 | Judi  | [Success] | 
| 2017-10-19 | Quickbooks | [Success] | 
| 2017-10-19 | Reception | [Success] | 
| 2017-10-20 | Judi  | [Success] | 
| 2017-10-20 | Quickbooks | [Success] | 
| 2017-10-20 | Reception | [Success] | 
| 2017-10-21 | Judi  | [Success] | 
| 2017-10-21 | Quickbooks | [Success] | 
| 2017-10-22 | Judi  | [Success] | 
| 2017-10-22 | Quickbooks | [Success] | 
| 2017-10-23 | Judi  | [Success] | 
| 2017-10-23 | Reception | [Success] | 
| 2017-10-24 | Judi  | [Success] | 
| 2017-10-24 | Megan  | [Failed] | 
| 2017-10-24 | Quickbooks | [Success] | 
| 2017-10-25 | Judi  | [Success] | 
| 2017-10-25 | Megan  | [Success] | 
| 2017-10-25 | Quickbooks | [Success] | 
| 2017-10-25 | Reception | [Success] | 
| 2017-10-26 | Judi  | [Success] | 
| 2017-10-26 | Megan  | [Success] | 
| 2017-10-26 | Quickbooks | [Success] | 
| 2017-10-26 | Reception | [Success] | 
| 2017-10-27 | Judi  | [Success] | 
| 2017-10-27 | Quickbooks | [Success] | 
| 2017-10-27 | Reception | [Success] | 
| 2017-10-28 | Judi  | [Success] | 
| 2017-10-28 | Quickbooks | [Success] | 
| 2017-10-29 | Judi  | [Success] | 
| 2017-10-29 | Quickbooks | [Success] | 
| 2017-10-30 | Judi  | [Success] | 
| 2017-10-30 | Megan  | [Success] | 
| 2017-10-30 | Quickbooks | [Success] | 
| 2017-10-30 | Reception | [Success] | 
| 2017-10-31 | Megan  | [Success] | 
| 2017-10-31 | Reception | [Success] | 
| 2017-11-01 | NULL  | NULL  | 
+------------+------------+-----------+ 

:中

SELECT calendar_table.dt,BackupDetail.User, BackupDetail.Status 
FROM calendar_table 
LEFT JOIN BackupDetail ON (calendar_table.dt = 
DATE(BackupDetail.Date)) 
where calendar_table.dt BETWEEN date_add(curdate(), interval -14 day) 
AND curdate() 
GROUP BY calendar_table.dt,BackupDetail.User 

結果:他のユーザーがその日のデータを有することができるよう 私の現在のクエリは、特定のユーザーが特定の日のためのステータスデータを持たないNULL値を排除していますJOINの中で特定のユーザーを照会するための照会:

0123:

SELECT calendar_table.dt,BackupDetail.User, BackupDetail.Status 
FROM calendar_table 
LEFT JOIN BackupDetail ON (calendar_table.dt = 
DATE(BackupDetail.Date) and BackupDetail.User = 'Quickbooks') 

where calendar_table.dt BETWEEN date_add(curdate(), interval -14 day) 
AND curdate() 

GROUP BY calendar_table.dt,BackupDetail.User 

は、私は望ましい結果に近づきます

+------------+------------+-----------+ 
| dt   | User  | Status | 
+------------+------------+-----------+ 
| 2017-10-18 | Quickbooks | [Success] | 
| 2017-10-19 | Quickbooks | [Success] | 
| 2017-10-20 | Quickbooks | [Success] | 
| 2017-10-21 | Quickbooks | [Success] | 
| 2017-10-22 | Quickbooks | [Success] | 
| 2017-10-23 | NULL  | NULL  | 
| 2017-10-24 | Quickbooks | [Success] | 
| 2017-10-25 | Quickbooks | [Success] | 
| 2017-10-26 | Quickbooks | [Success] | 
| 2017-10-27 | Quickbooks | [Success] | 
| 2017-10-28 | Quickbooks | [Success] | 
| 2017-10-29 | Quickbooks | [Success] | 
| 2017-10-30 | Quickbooks | [Success] | 
| 2017-10-31 | NULL  | NULL  | 
| 2017-11-01 | NULL  | NULL  | 
+------------+------------+-----------+ 

結果を最初のテーブルと比較すると、23番目と31番目のエントリがNULLであるため結果が削除されていることがわかります。

プロシージャまたは共用体の文を作成する方法。最も洗練されたソリューションは何でしょうか?

ありがとうございました。

+2

アプリケーションコードで不足している日付を処理する。集約関数がない場合は、クエリにGROUP BY句を含めないでください。これは、無意味な結果セットを返す確実な方法です。 – Strawberry

+0

私は数、同じ結果を追加することができます... –

+0

はい。まだ無意味です! – Strawberry

答えて

0

のは、最初の日付を取得してみましょう:

select dt 
from calendar_table 
where dt between date_add(curdate(), interval -14 day) and curdate(); 

次にユーザー:

select distinct user from backupdetail; 

あなたは(あなたが持っている必要がありますように)ユーザーテーブルを持っている場合は、代わりにそのテーブルからユーザーを選択したいですもちろん。その後

のは、昼とユーザーごとのステータスを取得してみましょう:今

select distinct user, date, status 
from backupdetail 
where status = 'Success'; 

select user, date, group_concat(distinct status order by status) as statuses 
from backupdetail 
group by user, date; 

あなたは、ステータス=「成功」にのみ関心がある場合は、当然のことながら、この単なるを作ることができますjoin:まず、日付とユーザーのすべての組み合わせ(CROSS JOIN)を作成し、既存のbackupdetailレコードを外部結合します。

SELECT 
c.dt, 
u.user, 
COALESCE(b.status, 'NO DATA') as status 
FROM 
(
    select dt 
    from calendar_table 
    where dt between date_add(curdate(), interval -14 day) and curdate() 
) c 
CROSS JOIN (select distinct user from backupdetail) u 
LEFT JOIN 
(
    select distinct user, date, status 
    from backupdetail 
    where status = 'Success' 
) b ON b.user = u.user AND date(b.date) = c.dt 
ORDER BY c.dt, u.user; 
+0

BrilliantありがとうThorsten。 –

関連する問題