2014-02-19 62 views
2

请参见下面的MySQL表。分组按多个列来获取月份的常用条目

-

- 
-- Table structure for table `sample_table` 
-- 

CREATE TABLE IF NOT EXISTS `sample_table` (
    `id` bigint(11) NOT NULL AUTO_INCREMENT, 
    `station` varchar(300) NOT NULL, 
`city` varchar(300) NOT NULL, 
    `reviewcount` int(6) NOT NULL, 
    `result_month` varchar(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 

INSERT INTO `sample_table`(`id`, `station`, `reviewcount`, `result_month`) VALUES 
(1, 'A','NewYork', 10, 'Jan'), 
(2, 'B','NewYork', 12, 'Jan'), 
(3, 'C','Florida', 14, 'Jan'), 
(4, 'A','NewYork', 12, 'Feb'), 
(5, 'B','NewYork', 14, 'Feb'), 
(6, 'C','Florida', 20, 'Feb'), 
(7, 'D','Washington', 12, 'Feb'), 
(8, 'A','NewYork', 14, 'Mar'), 
(9, 'B','NewYork', 14, 'Mar'), 
(10, 'C','Florida', 28, 'Mar'); 

在这里,我需要克服一系列时期同一站的信息。

也就是说,如果我们选择范围从1月到3月,应该显示每个月结果行的站点。

这里只站A和C是在选定的范围,即从1至3月

每月检讨计数

因此,我需要得到像

A - Jan - 10 
C - Jan - 14 

A - Feb - 12 
C - Feb - 20 

A - Mar - 14 
C - Mar - 28 

我试着GROUP BY结果站,result_month,也尝试过JOIN的表,但它没有帮助。

我正在处理一个有数千个工作站的巨大表格,我也需要查询进行优化。

第二部

我需要得到城市明智的汇总信息也 对输出应该是什么样子,

City -Station Count - Review Count 

NewYork - 2 - 22 -Jan 
Florida - 1 - 14 - Jan 

NewYork - 2 - 26 -Jan 
Florida - 1 - 10 - Jan 

NewYork - 2 - 28 -Jan 
Florida - 1 - 28 - Jan 

任何帮助将是非常appreciated.Thanx提前。

+0

在已提供有所述例子是无关组仅有1个WHERE子句站IN(“A”,“C”)。分组用于存在多行时使用相同数据的情况(可能有一些不同点,例如不同的reviewcounts) – Svetoslav

+0

在这种情况下,站点数是以十万为单位的。在IN子句中放入十万个条目是否是一种很好的做法? – suneesh

+0

那些真正的DDL?!?!?Suneesh南亚以外的任何人都不知道什么是十万分之一(尽管我接受这是相当多的人)! – Strawberry

回答

1

第一阶段是让那些在每个月的入口站:

SELECT station 
FROM sample_table 
GROUP BY station 
HAVING COUNT(DISTINCT result_month) = 
      (SELECT COUNT(DISTINCT result_month) FROM sample_table); 

这将让你A和C(Example on SQL Fiddle)。

然后,您可以加入这个回你的主表:

SELECT t.station, t.reviewcount, t.result_month 
FROM sample_table t 
     INNER JOIN 
     ( SELECT station 
      FROM sample_table 
      GROUP BY station 
      HAVING COUNT(DISTINCT result_month) = 
         (SELECT COUNT(DISTINCT result_month) FROM sample_table) 
     ) t2 
      ON t2.station = t.station; 

Example on SQL Fiddle


编辑

你的第二个要求是有点不清楚,我不是当然,你想把城市组合在一起,即我˚F您的数据如下:

(1, 'A','NewYork', 10, 'Jan'), 
(2, 'B','NewYork', 10, 'Jan'), 
(3, 'C','NewYork', 10, 'Jan'), 
(4, 'A','NewYork', 10, 'Feb'), 
(5, 'B','NewYork', 10, 'Feb'), 
(6, 'A','NewYork', 10, 'Mar'), 
(7, 'B','NewYork', 10, 'Mar'); 

应该总和包括站C因为纽约有每个月的入口?因此一月份将有共计30在这种情况下,您的查询将是:

SELECT t.City, SUM(t.reviewcount) AS reviewcount, t.result_month 
FROM sample_table t 
     INNER JOIN 
     ( SELECT City 
      FROM sample_table 
      GROUP BY City 
      HAVING COUNT(DISTINCT result_month) = 
         (SELECT COUNT(DISTINCT result_month) FROM sample_table) 
     ) t2 
      ON t2.City = t.City 
GROUP BY t.City, t.result_month; 

Example on SQL Fiddle

或者它应该只包含A和B,因为这些电台必须每个月的入口?所以Jan总共只有20个。在选择查询将

SELECT t.City, SUM(t.reviewcount) AS reviewcount, t.result_month 
FROM sample_table t 
     INNER JOIN 
     ( SELECT station 
      FROM sample_table 
      GROUP BY station 
      HAVING COUNT(DISTINCT result_month) = 
         (SELECT COUNT(DISTINCT result_month) FROM sample_table) 
     ) t2 
      ON t2.station = t.station 
GROUP BY t.City, t.result_month; 

Example on SQL Fiddle

+0

这是相当有帮助。但我在将它与aggegator部分结合时遇到了麻烦,我已经为您更新了问题。请给我建议。 – suneesh

+0

非常感谢。我如何优化表格,因为它包含数百万条目? – suneesh

+0

取决于哪个查询你去了。我可能会建议和索引'station'和'result_month' - 即'CREATE INDEX IX_sampletable_station _resultmonth ON Sample_table(station,result_month)' – GarethD

0

GROUP BY子句用于汇总基于一些分组条件的数据。对于第一个示例,我将基于名为Sales.SalesOrderDetailAdventureWork2012数据库表中的单个列对数据进行分组。这个例子和我的其余大部分例子都使用AdventureWorks2012数据库。如果你想跟随。 http://academy.comingweek.com/sql-groupby-clause/