2015-05-05 228 views
0

我有以下的SQL語句可以工作,但是我然後想按YEAR(updated_at),MONTH(updated_at)將結果分組,並按年份給我一個總數。那麼應該做的就是找到我order_id存在多於一次的所有結果,然後再爲每年的每個月執行一次總計。我想我需要做一個子查詢,但是我嘗試過的所有東西都會引發錯誤。按分組的SQL組,然後按日期分組結果

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 
+0

我想你可能不得不使用選擇月份(updated_at)作爲年份的月份,年份(updated_at),然後說GROUP by order_id,月份 –

+0

你能告訴我你有哪些錯誤,所以我可以幫助你更具體嗎? –

+1

感謝您的狀態報告。你有*問題*嗎?注意:在顯示的查詢中,'updated_at'列返回的值是* not * deterministic。 (其他數據庫會給這個SQL引發一個錯誤,如果我們設置'sql_mode'包含'ONLY_FULL_GROUP_BY',我們也可能會讓MySQL拋出一個錯誤。)顯示錶中相關列值的*例*,顯示預期結果集的*示例*將提供更清晰的規範。如果你設置一個[SQL小提琴](http://sqlfiddle.com),那會更好。 – spencer7593

回答

0

您的查詢,因爲它代表會爲您提供不可靠的結果,因爲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; 

爲了得到任何進一步的幫助,您需要提供表格定義,一些示例數據以及您試圖提取的結果。

fiddle here

+0

我已經添加了一個顯示錶格結構的圖像我不認爲這些東西加起來是正確的嗎? –

+0

@WillWright我沒有在該數據中看到任何重複的'order_ids' - 這意味着這個查詢不應該返回任何結果。 'order_id'是什麼意思不止一次存在? –

+0

對不起,我只顯示了一個片段,表格有31192行 –

0

我想你問的是像一個這樣的查詢返回一個結果集:

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') 

在這一點上,我仍然只是猜測你想返回的結果集。

+0

我已經更新了這個小提琴與您的建議http://sqlfiddle.com/#!9/449f4/1它不給我一個總的每個月? –

+0

@WillWright:目前還不清楚你想要的總數。你可以從SELECT列表和GROUP BY中省略'order_id'。這會給你一個月的「總數」。 (這將是表中具有'order_id'的行的* count *行,該行在表中是重複的(出現多次)。 – spencer7593