2015-10-19 33 views
1

我必須做一個SQL查詢獲取一年中所有月份的公司收入,但有些月沒有記錄在表中。MySQL得到所有今年的所有月份統計

我已經使用這個查詢:

SELECT COUNT(wp_dgl_stats.datetime_stamp)*wp_dgl_ads.price as incomes, MONTHNAME(wp_dgl_stats.datetime_stamp) as month 
FROM wp_dgl_ads 
INNER JOIN wp_dgl_stats ON wp_dgl_stats.id_ad = wp_dgl_ads.id 
WHERE YEAR(wp_dgl_stats.datetime_stamp) = 2015 
GROUP BY MONTHNAME(wp_dgl_stats.datetime_stamp) 

我不得不說,wp_dgl_stats包含通過在網絡的某些空間的用戶所做的每一次點擊(廣告顯示)與該廣告的引用記錄和日期時間戳。

此查詢返回的確切月份與收入和確切金額。但我需要得到其餘的幾個月的0.

這怎麼能做到?

+0

只需用零填充即可。 – Legionar

+0

不能這樣做,這意味着改變平臺的完整來源,並可能改變所有的統計數據。沒有選擇。 –

+0

'LEFT/RIGHT'加入包含數字1到12的集合(如果您的月份數字爲0,則爲0到11)。 http://stackoverflow.com/questions/10922064/how-do-i-get-a-list-of-numbers-in-mysql –

回答

3

經過大量的測試,我得到了妥善的解決辦法。如果有人需要解釋,我會在這裏發佈。

SELECT meses.month, CAST(COUNT(stats.id)*ads.precio AS UNSIGNED) as precio 
      FROM 
      (
         SELECT 1 AS MONTH 
         UNION SELECT 2 AS MONTH 
         UNION SELECT 3 AS MONTH 
         UNION SELECT 4 AS MONTH 
         UNION SELECT 5 AS MONTH 
         UNION SELECT 6 AS MONTH 
         UNION SELECT 7 AS MONTH 
         UNION SELECT 8 AS MONTH 
         UNION SELECT 9 AS MONTH 
         UNION SELECT 10 AS MONTH 
         UNION SELECT 11 AS MONTH 
         UNION SELECT 12 AS MONTH 
      ) as meses 
      LEFT JOIN wp_dgl_stats stats ON meses.month = MONTH(stats.datetime_stamp) 
      LEFT JOIN wp_dgl_ads ads ON stats.id_ad = ads.id AND YEAR(stats.datetime_stamp) = '2015' 
      GROUP BY meses.month 

因爲我是一個西班牙的開發商和我需要西班牙月份名稱,我選擇了每月數,並用PHP數組,我們可以在一個月數字轉換爲自己的西班牙名字。

如果有人有一些問題,那麼,我會很樂意回答。

1

你可以LEFT/RIGHT參加上月:

WITH monthnames AS (SELECT <something that returns a list of the month names> as monthname) 
SELECT COALESCE(COUNT(wp_dgl_stats.datetime_stamp)*wp_dgl_ads.price, 0) as incomes, MONTHNAME(wp_dgl_stats.datetime_stamp) as month 
FROM wp_dgl_ads 
INNER JOIN wp_dgl_stats ON wp_dgl_stats.id_ad = wp_dgl_ads.id 
RIGHT JOIN monthnames ON month = monthname 
WHERE YEAR(wp_dgl_stats.datetime_stamp) = 2015 
GROUP BY MONTHNAME(wp_dgl_stats.datetime_stamp)