2012-07-17 76 views
1

在這裏遇到了一些問題。我不能爲我的生活,找出如何做到這一點。計算多個月的不同值

pid | firstlast | lastvisit | zip 
--------------------------------------- 
435 | 2001-01-17 | 2012-01-21 | 46530 
567 | 2001-01-18 | 2012-01-21 | 46530 
532 | 2001-01-19 | 2012-01-22 | 46535 
536 | 2001-01-19 | 2012-01-23 | 46535 
539 | 2001-01-20 | 2012-01-27 | 46521 

這裏是我的SQL查詢:

SELECT DISTINCT zip, COUNT(zip) AS totalzip FROM production WHERE MONTH(lastvisit) = "1" GROUP BY zip ORDER BY totalzip DESC; 

輸出:

揚:

zip | totalzip 
--------------------- 
46530 | 2 
46535 | 2 
46521 | 1 

二月:

zip | totalzip 
--------------------- 
46530 | 1 
46521 | 4 
49112 | 3 

這對第一個月來說很棒,但我需要整整一年。我可以運行此查詢12次,但會出現2個問題。全年我有超過300個郵政編碼。在某些月份,郵政編碼不存在,因此計數爲0(但MySQL輸出不輸出「零數據」。此外,當我通過totalzip訂購時,訂單每個月都會發生變化,而這並不允許我將它們粘貼到電子表格中,我可以通過郵政編碼進行訂購,但「零」數據郵政編碼不存在,因此列表每月變化不定。 !

+0

感謝您的幫助球員。使用你的一些想法,我能夠進一步發展。儘管如此,我仍然遇到了獲取格式良好的數據的問題。 SELECT * FROM生產 INNER JOIN (SELECT DISTINCT拉鍊,COUNT(拉鍊)AS揚從生產WHERE MONTH(lastvisit)= 「1」 GROUP BY拉鍊)AS JanCount ON (production.zip = JanCount。拉鍊) INNER JOIN (SELECT DISTINCT拉鍊,COUNT(拉鍊)AS二月從生產WHERE MONTH(lastvisit)= 「2」 GROUP BY拉鍊)AS FebCount ON (production.zip = FebCount.zip) 但我得到了重複的記錄。 – user1532528 2012-07-17 18:52:53

+0

我只是一個基本的mysql用戶,所以我不確定這些連接是如何工作的以及爲什麼數據在重複。 我需要的是這樣的排: 46516:71 | 45 | 32 | 45 | 12 | 66 | 55 | 32 | 22 | 66 | 71 | 12 (每個數字代表一個月的計數(1月 - 12月) – user1532528 2012-07-17 18:54:22

+0

檢查我的答案...這會給你你需要的東西 – Barranka 2012-07-17 20:28:38

回答

1

您可以使用子查詢這項工作:

select 
    a.*, count(c.zip) as totalZip 
from 
    (select 
     monthVisit, zip 
    from 
     (select distinct last_day(lastVisit) as monthVisit from production) as m, 
     (select distinct zip from production) as z 
    ) as a 
    left join (select 
        last_day(lastVisit) as monthVisit, zip 
       from production) as c 
     on a.monthVisit=c.monthVisit and a.zip=c.zip 
group by 
    a.monthVisit, a.zip 

這應該給你呼嘯而過的計數每個月你有,包括零。

讓我解釋一下這是如何工作:

首先,我定義了一個子查詢,使所有可能的拉鍊和幾個月的組合(該a子查詢),然後我離開了第二子查詢加入了這一點,返回ZIP和月份的值(c子查詢)。使用left join可以計算a子查詢中可能的空組合。

希望這對你有所幫助。

注意:last_day()函數返回給定日期的月份的最後一天;例如:last_day('2012-07-17')='2012-07-31'

+0

只是一個評論:這隻適用於如果你的表不大,自'last_day ()'函數必須爲每條記錄進行評估,但是,由於您已經使用'month()'函數對數據進行了分組,所以這可能正是您所需要的。 – Barranka 2012-07-17 18:09:39

+0

您的查詢必須有錯誤。在任何一個月的拉鍊只會返回「0」或「1」訪問,其中一些拉鍊應該有近百次訪問, – user1532528 2012-07-18 14:34:18

+0

@ user1532528呃,你說的對不對,我想你想要一個獨特的拉鍊數。再次檢查答案,我編輯了查詢(只需在查詢'c'中刪除'distinct']。 – Barranka 2012-07-18 16:22:53

0

如果你有郵政編碼表(你應該),您可以與您的數據表(左連接),這將使甚至零計數郵編加入。

0

你的問題的第一部分用另外的分組解決RY是這樣的:有一個完整列表

SELECT DISTINCT zip, YEAR(lastvisit), MONTH(lastvisit), COUNT(zip) AS totalzip 
FROM production 
GROUP BY zip, YEAR(lastvisit), MONTH(lastvisit) 
ORDER BY totalzip DESC; 

要在「零」摘要加時不存在數據通常我做了左聯接。 (這也是由上面的@Alfabravo聲明的)。所以最終的查詢看起來有點像:

SELECT DISTINCT zip, YEAR(lastvisit), MONTH(lastvisit), COUNT(zip) AS totalzip 
FROM production left join 
     (SELECT DISTINCT zip from production) as zipMap on zipmap.zip = production.zip 
GROUP BY zip, YEAR(lastvisit), MONTH(lastvisit) 
ORDER BY totalzip DESC;