Mysql

根據 DATE 欄位計算表中的行數

  • March 24, 2019

我有一個包含 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

等等。

但是這種方法似乎有點詳盡,我很確定有一種方法可以在單個查詢中完成,但不確定從哪裡開始。

您必須按照以下方式使用COUNT函式和GROUP BY函式

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;

引用自:https://dba.stackexchange.com/questions/232601