[英]SQL group by id then group the results by date
我有以下有效的sql語句,但是接下來我想將結果按YEAR(updated_at),MONTH(updated_at)分組,並按年份的月份總計。 然后,應該做的是找到order_id存在一次以上的所有結果,然后對一年中的每個月進行總計。 我想我需要做一個子查詢,但是我嘗試過的一切都會引發錯誤。
SELECT `order_id` , `updated_at` , COUNT( * ) AS grand_total1
FROM mg_sales_flat_shipment_track
GROUP BY `order_id`
HAVING COUNT( * ) >1
ORDER BY updated_at DESC
數據集:
entity_id parent_id order_id track_number title carrier_code created_at updated_at
31468 33349 36055 31237970006263 UK Mail trackerl 2015-05-01 19:30:52 2015-05-01 19:30:52
31453 33348 36054 31237970006264 UK Mail trackerl 2015-05-01 19:30:49 2015-05-01 19:30:49
31414 33347 36052 31237970006273 UK Mail trackerl 2015-05-01 19:30:20 2015-05-01 19:30:20
31469 33346 36050 31237970006265 UK Mail trackerl 2015-05-01 19:30:52 2015-05-01 19:30:52
31461 33345 36049 31237970006266 UK Mail trackerl 2015-05-01 19:30:47 2015-05-01 19:30:47
31406 33344 36048 31237970006267 UK Mail trackerl 2015-05-01 19:30:14 2015-05-01 19:30:14
31404 33343 36047 31237970006268 UK Mail trackerl 2015-05-01 19:30:13 2015-05-01 19:30:13
31407 33342 36046 31237970006269 UK Mail trackerl 2015-05-01 19:30:15 2015-05-01 19:30:15
31462 33341 36045 31237970006270 UK Mail trackerl 2015-05-01 19:30:48 2015-05-01 19:30:48
31405 33340 36044 31237970006271 UK Mail trackerl 2015-05-01 19:30:14 2015-05-01 19:30:14
31383 33153 35837 31237970006197 UK Mail tracker1 2015-04-30 20:00:43 2015-04-30 20:00:43
31252 33153 35837 31237970006051 UK Mail tracker1 2015-04-29 20:00:25 2015-04-30 20:00:43
現有的查詢將為您提供不可靠的結果,因為updated_at
未包含在group by
子句中,也未在聚合函數中使用。
如果您想要的是具有多個條目的所有order_ids
,則要獲取一年中每個月的計數,則它看起來像這樣:
select year(updated_at) y, month(updated_at) m, count(*) from
( SELECT `order_id` , COUNT( * ) AS grand_total
FROM mg_sales_flat_shipment_track
GROUP BY `order_id`
HAVING COUNT( * ) >1
) q1
inner join mg_sales_flat_shipment_track t
on q1.order_id = t.order_id
group by year(updated_at), month(updated_at)
order by year(updated_at) desc, month(updated_at) desc;
為了獲得更多幫助,您需要提供表定義,一些示例數據以及要提取的結果。
我認為您要的是一個類似這樣的查詢返回的結果集:
SELECT o.order_id
, DATE_FORMAT(o.updated_at,'%Y-%m') AS `yyyymm`
, COUNT(1) AS `cnt`
FROM ( SELECT d.order_id
FROM mg_sales_flat_shipment_track d
GROUP BY d.order_id
HAVING COUNT(1) > 1
) c
JOIN mg_sales_flat_shipment_track o
ON o.order_id = c.order_id
GROUP
BY o.order_id
, DATE_FORMAT(o.updated_at,'%Y-%m')
讓我們打開包裝。 內聯視圖c
基本上為我們提供了出現多次的order_id
值列表。 由於GROUP BY
,它將成為一個不同的列表(每個order_id
一行)。
我們可以將內聯視圖中的行(MySQL稱為“派生表”)重新連接到表中,以獲取所有order_id
與列表中的一個匹配的行。 我們期望對於每個order_id
值,我們將從原始表中至少獲取兩行。
我們使用DATE_FORMAT函數獲取年份和月份。 我們對此進行了GROUP BY,並獲得了每個月的計數。
如果您需要“總計”,我們可以在內聯視圖中包含一個COUNT()
,然后在外部查詢的SELECT列表中引用該列。 order_id的“總計”將在order_id的每一行上重復。
跟進
它不會給我每個月的總數
尚不清楚您想要總計。
您可以省略SELECT列表中的order_id
列以及外部查詢中的ORDER BY子句。 這樣一來,您就可以對order_id
出現在不止一行上的所有行按“月”進行“計數”。
SELECT DATE_FORMAT(o.updated_at,'%Y-%m') AS `yyyymm`
, COUNT(1) AS `cnt`
FROM ( SELECT d.order_id
FROM mg_sales_flat_shipment_track d
GROUP BY d.order_id
HAVING COUNT(1) > 1
) c
JOIN mg_sales_flat_shipment_track o
ON o.order_id = c.order_id
GROUP
BY DATE_FORMAT(o.updated_at,'%Y-%m')
此時,我仍在猜測您要返回的結果集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.