簡體   English   中英

SQL按ID分組,然后按日期分組結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM