2014-02-19 63 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/