2015-04-16 42 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 –

相关问题