2015-04-16 46 views
0

我有一個公用事業賬單表如下:如何在我的情況下在mysql查詢中使用case語句?

table: table_bill 
----------------------------------------------------------------------------- 
id | bill_type | month | year | lastdate | amount | latedate1 | lateamount1 | latedate2 | lateamount2| 
------------------------------------------------------------------------------ 
1 | Electricity | Jan | 2015 | 2015-02-01 | 500 | 2015-03-01 | 550 | 2015-04-01 | 600 
------------------------------------------------------------------------------ 
2 | Water | Jan | 2015 | 2015-03-01 | 200 | 2015-04-01 | 250 | 2015-05-01 | 300 
------------------------------------------------------------------------------- 
3 | Gas | Jan | 2015 | 2015-02-01 | 800 | 0000-00-00 | NULL | 0000-00-00 | NULL 
-------------------------------------------------------------------------------- 

表說明:

水電賬單有罰款,逾期付款,因此這些中填入數據,而另一方面,煤氣費對延遲付款沒有罰款。因此,Gas bill的數據可以是日期的或者數量爲零。

現在,當我想查看2015年3月1日的未付賬單,然後我想未付賬單如下表所示:

table: html table 
-------------------------------------------------------------- 
Bill Type | Month | Year | Next Payment Date | Payable Amount 
-------------------------------------------------------------- 
Electricity | Jan | 2015 | 2015-03-01 | 550 
-------------------------------------------------------------- 
Water | Jan | 2015 | 2015-03-01 | 200 
-------------------------------------------------------------- 
Gas | Jan | 2015 | 2015-02-01 | 800 
-------------------------------------------------------------- 

說明:由於電費具有優良的延期付款,我觀看賬單在2015年3月1日,所以下一個付款日期將是2015年3月1日,應付金額爲550延遲費用。另一方面,水費也可以延遲支付,但由於最後一次沒有滯納金的是2015年3月1日,所以下一次支付日期是2015年3月1日,金額爲200.由於煤氣帳單沒有遲到費,所以下一個支付日爲2015年2月1日,雖然我在2015年3月1日和應付金額查看賬單是800

問題:如何使一個SELECT查詢從數據庫表中提取數據的輸出上面的未付賬單表?

我想使用CASE語句,但不爲人所熟知有關case語句。我曾嘗試使用以下查詢:

$today = gmdate('Y-m-d', time()+21600); 
SELECT bill_type, month, year, 
CASE bill_type WHEN Electricity AND $today<=lastdate THEN lastdate 
WHEN Electricity AND $today<=lastdate1 THEN latedate1 
WHEN Electricity AND $today<=lastdate2 THEN lastdate2 
WHEN Electricity AND $today<=lastdate3 THEN lastdate3 
WHEN Water AND $today<=lastdate1 THEN latedate1 
WHEN Water AND $today<=lastdate2 THEN lastdate2 
WHEN Water AND $today<=lastdate3 THEN lastdate3 
ELSE lastdate END) as ldate, 
CASE bill_type WHEN Electricity AND $today<=lastdate THEN amount 
WHEN Electricity AND $today<=lastdate1 THEN lateamount1 
WHEN Electricity AND $today<=lastdate2 THEN lateamount2 
WHEN Electricity AND $today<=lastdate3 THEN lateamount3 
WHEN Water AND $today<=lastdate1 THEN lateamount1 
WHEN Water AND $today<=lastdate2 THEN lateamount2 
WHEN Water AND $today<=lastdate3 THEN lateamount3 
ELSE amount END) as amount FROM table_bill 

但上面的查詢不工作,也實在是太大了,如果將有更多的bill_type像衛生,互聯網,網站託管等。對於每個bill_type,我必須做出兩個CASE語句,並且在每個CASE語句中,我必須使用WHEN ..... THEN很多次。

如何使查詢可行和簡單儘可能?

回答

0

我想在這裏需要一些標準化。您的問題是由於帳單表中的冗餘造成的,您應該將遲付費用從帳單表中分離 - 用於達到具體相關級別的附加費用(不包括帳單金額*)。這樣,你可以有:基於例如用於電力新latecharge

SELECT 
    bill.type, 
    bill.month, 
    bill.year, 
    (bill.amount + SUM(IFNULL(latecharge.amount, 0))) AS amount 
FROM bill 
LEFT JOIN latecharge 
    ON latecharge.bill_type = bill.type // might be assigned to concrete bill (id) 
    AND latecharge.afterdate <= DATE(NOW()) //or some :date parameter 
WHERE ... 
GROUP BY bill.id 

*)部分爲:

id|..bill_type|.afterdate|amount 
.1|Electricity|2015-03-01|....50 // additional 50 to Electricity bill's amount after 2015-03-01 
.2|Electricity|2015-04-01|....50 // and another 50 after 2015-04-01 
+0

無需正常化。我已經找出了這個問題。這將是:SELECT bill_type,一個月,一年,CASE WHEN bill_type = '電力' 或bill_type = '水' AND lastdate> ='$今天THEN lastdate WHEN bill_type = '電力' 或bill_type = '水' AND lastdate1> = '今天​​$',那麼lastdate1 WHEN bill_type = '電力' 或bill_type = '水' AND lastdate2> ='$今天THEN lastdate2 ELSE lastdate END作爲ldate –

相關問題