首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按多列分组以获取月份的公共条目

按多列分组以获取月份的公共条目
EN

Stack Overflow用户
提问于 2014-02-19 10:29:25
回答 2查看 75关注 0票数 2

请参阅下面的MySQL表。

-

代码语言:javascript
复制
-
-- 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');

在这里,我需要获得不同时段的同一台信息。

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

这里只有A站和C站在选定的范围内每个月都有复习计数,即从1月到3月。

因此我需要得到如下的结果

代码语言:javascript
复制
A - Jan - 10
C - Jan - 14

A - Feb - 12
C - Feb - 20

A - Mar - 14
C - Mar - 28

我试了一组一个站,result_month,也尝试了连接表,但它没有帮助。

我正在处理一个拥有数千个站点的大表,我需要对查询进行优化。

第二部分

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

代码语言:javascript
复制
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提前。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 10:55:36

第一阶段是让每个月都有一个条目的电台:

代码语言:javascript
复制
SELECT  station
FROM    sample_table
GROUP BY station
HAVING COUNT(DISTINCT result_month) = 
            (SELECT COUNT(DISTINCT result_month) FROM sample_table);

这将得到A和C (SQL Fiddle示例)。

然后,您可以将它加入到主表中:

代码语言:javascript
复制
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;

SQL Fiddle示例

编辑

你的第二个要求有点不清楚,我不知道你想在什么时候把这些城市分类,也就是说,如果你的数据如下:

代码语言:javascript
复制
(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个。在这种情况下,您的查询将是:

代码语言:javascript
复制
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;

SQL Fiddle示例

还是应该只包括A和B,因为这些电台每个月都有一个条目?所以Jan总共只有20个。

代码语言:javascript
复制
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;

SQL Fiddle示例

票数 1
EN

Stack Overflow用户

发布于 2016-05-11 10:49:29

GROUP子句用于根据某些分组标准总结数据。在第一个示例中,我将根据AdventureWork2012数据库表Sales.SalesOrderDetail中的单个列对数据进行分组。这个例子和我剩下的大多数示例都使用AdventureWorks2012数据库。如果你想跟着走。http://academy.comingweek.com/sql-groupby-clause/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21877747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档