2015-05-05 171 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