Mysql
根據 DATE 欄位計算表中的行數
我有一個包含 3 列的表(order_id、client_id、date_added)。內容看起來像這樣:
order_id | client_id | date_added ----------------------------------- 14152 | NA4156 | 2019-03-01 14153 | EA4656 | 2019-03-02 14154 | EA4656 | 2019-03-02 14155 | CA4456 | 2019-03-03 14156 | DA4556 | 2019-03-03 14157 | EA4656 | 2019-03-03 14158 | FA4756 | 2019-03-06 14159 | GA4856 | 2019-03-06
等等。正如您在某一天看到的那樣,可能沒有條目。
我正在嘗試獲得以下結果:
date | no_of_rows ----------------------------- 2019-03-01 | 1 2019-03-02 | 2 2019-03-03 | 4 2019-03-04 | 4 2019-03-05 | 4 2019-03-06 | 6
我從這裡了解如何生成我正在尋找的所有日期,但我現在不確定如何根據每個日期的client_id計算唯一客戶。
目前我正在逐步執行此操作,並將數據移動到 Excel 並使用以下查詢從那里處理它:
在 2019-03-01 之前獲得唯一數量的註冊客戶
SELECT COUNT(client_id) FROM clients WHERE date_added < '2019-03-02' GROUP BY client_id
在 2019-03-02 之前獲得唯一數量的註冊客戶
SELECT COUNT(client_id) FROM clients WHERE date_added < '2019-03-03' GROUP BY client_id
等等。
但是這種方法似乎有點詳盡,我很確定有一種方法可以在單個查詢中完成,但不確定從哪裡開始。
SELECT date_added AS Date, COUNT(Client_ID ) AS no_of_rows FROM CLIENTS GROUP BY date_added ORDER BY date_added;
使用上述產生的輸出形式為
Date no_of_rows 2019-03-01 1 2019-03-02 2 2019-03-03 3 2019-03-06 2
順便說一句,最好不要使用數據類型的名稱來命名列,即我可能會在結果 ClientDate 中呼叫 Data 列。
讓我們稱您的表為 ORDERS。正如您在問題中提到的,某一天可能沒有任何訂單,但在您的最終報告中,即使是那些日子也應該存在。
要獲得所需的輸出,我們必須將this、LEFT JOIN、GROUP BY 和 COUNT 結合起來。
第 1 步:創建一個名為V_DATES的視圖:
create view V_DATES as select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from ( select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t0, ( select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t1, ( select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t2, ( select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t3, ( select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t4
**第 2 步:**執行以下查詢以獲得所需的輸出
select vd.selected_date, count(distinct c.client_id) from V_DATES vd left outer join CLIENTS c on vd.selected_date = c.date_added where vd.selected_date between '2019-03-01' and '2019-03-06' group by vd.selected_date;