2013-12-16 35 views
-1

您好,我創建了一個查詢來顯示一些月份的信息,但在某些情況下不起作用。嘗試在條件案例中出錯

這裏是我想

|jan| |feb| |mar| |apr| |may| |jun| |jul| |ago| |sep| |oct| |nov| |dic| 
id1 id1 id1 id1 id1 id1 id1 id1 id1 id1 id1 id1 
id2 id2 id2 id2 id2 id2 id2 id2 id2 id2 id2 id2 
id3 id3 id3 id3 _____________________________________________ 
id4 id4 id4 id4 id4 _______________________________________ 
_____________________ id5 id5 id5 id5 id5 _______________ 

而且也是這個

|jan| |feb| |mar| |apr| |may| |jun| |jul| |ago| |sep| |oct| |nov| |dic| 
    4  4  4  4  4  3  3  3  3  2  2  2 

這裏是我的表

CREATE TABLE policies (
id INT, 
date_ini DATE, 
date_end DATE, 
num_policy INT); 

INSERT INTO policies VALUES 
( 1,  '2013-01-16', '2014-01-01',1234),  
( 2,  '2013-01-14', '2014-02-06',5678), 
( 3,  '2012-03-17', '2013-04-24',9123), 
( 4,  '2012-04-05', '2013-05-24',4567), 
( 5,  '2013-05-19', '2014-06-20',8912); 

這裏是我的查詢

SET @year := 2013; 

SELECT 
CASE WHEN CONCAT(@year, '-01-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jan, 
CASE WHEN CONCAT(@year, '-02-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Feb, 
CASE WHEN CONCAT(@year, '-03-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Mar, 
CASE WHEN CONCAT(@year, '-04-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Apr, 
CASE WHEN CONCAT(@year, '-05-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END May, 
CASE WHEN CONCAT(@year, '-06-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jun, 
CASE WHEN CONCAT(@year, '-07-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jul, 
CASE WHEN CONCAT(@year, '-08-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Aug, 
CASE WHEN CONCAT(@year, '-09-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Sep, 
CASE WHEN CONCAT(@year, '-10-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Oct, 
CASE WHEN CONCAT(@year, '-11-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Nov, 
CASE WHEN CONCAT(@year, '-12-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END `Dec` 
FROM 
    policies 
WHERE 
    date_end >= CONCAT(@year, '-01-01') 
AND 
    date_ini <= CONCAT(@year, '-12-01') 

這裏是我試過http://sqlfiddle.com/#!2/699cb/1

是不是在所有情況下工作,我有這個

|jan| |feb| |mar| |apr| |may| |jun| |jul| |ago| |sep| |oct| |nov| |dic| 
___ id1 id1 id1 id1 id1 id1 id1 id1 id1 id1 id1 => not working 
___ id2 id2 id2 id2 id2 id2 id2 id2 id2 id2 id2 => not working 
id3 id3 id3 id3 _____________________________________________ => is working 
id4 id4 id4 id4 id4 _______________________________________ => is working 
___________________________ id5 id5 id5 id5 _______________ => not working 

請有人可以幫助我?

我真的很感謝您的幫助。

+0

爲什麼不工作? 2013年1月 - 1月1日不在這兩個日期之間,所以你不會得到第一個id1。與id2相同。 – Josh

+0

你可以檢查這個嗎? http://sqlfiddle.com/#!2/699cb/1 ....這是正確的 –

+1

2013-01-01不在'2013-01-16'和'2014-01-01'之間,這就是爲什麼它id1的id1爲null,而2013-01-01不在id2的「2013-01-14」和「2014-02-06」之間。我錯過了什麼?它看起來正確 – Josh

回答

4

您正在嘗試查找以月爲粒度的重疊。然而,通過使用date數據類型,您必須處理這個月中那些討厭的日子。正如評論中指出的那樣,1月1日是在該月開始的任何政策之前。

解決方案是在正確的粒度級別上執行邏輯。使用date_format()將日期格式設置爲YYYY-MM。然後使用這個邏輯。這是第一個月的例子:

SELECT (CASE WHEN CONCAT(@year, '-01') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_end, '%Y-%m') 
      THEN CONCAT('id', id) 
     END) Jan, 

編輯:

要得到的總和,你會怎麼做:

SELECT SUM(CASE WHEN CONCAT(@year, '-01') BETWEEN date_format(date_ini, '%Y-%m') AND date_format(date_end, '%Y-%m') 
      THEN 1 ELSE 0 
      END) Jan, 
     . . . 
FROM policies 
WHERE date_end >= CONCAT(@year, '-01-01') AND date_ini <= CONCAT(@year, '-12-01'); 
+0

它只會在一月份正確工作嗎?我是否需要將這個添加到所有月份? –

+1

@CarlitosMorales。 。 。是的,你需要在所有月份內添加它。 –

+0

我有最後一個問題,我該怎麼做才能總結所有jan,所有feb,都是mar ....? –

1

這裏是發生了什麼,

CASE WHEN CONCAT(@year, '-01-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jan, 

這種說法是說,當2013-01-01 is between 2013-01-16 AND 2014-01-01然後選擇Jan但日期不在之間的日期設置

一月的第一天不間2013年1月16日和2014年1月1日

+0

okey我明白了,謝謝 –

+0

瑪拉基可以幫我嗎?我更新了我的問題,並添加了最終查詢 –