2015-04-16 6 views
0

У меня есть таблица счета за коммунальные услуги следующим образом:Как использовать оператор case в запросе mysql в моем случае?

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 
-------------------------------------------------------------------------------- 

Таблицы Описание:

Электричество и банкнота Воды есть штраф за просрочку платежа, поэтому эти столбцы заполняются данными, с другой стороны, законопроект газа не имеет штрафа за просрочку платежа. Таким образом, данные счета за газ составляют 0000-00-00 для даты или Null для суммы.

Теперь, когда я хочу, чтобы просмотреть неоплаченный счет на 2015-03-01, то я хочу, неоплаченный счет в следующей таблице:

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-03-01, поэтому следующая дата платежа будет равна 2015-03-01, а сумма к оплате - 550 с оплатой за просрочку. С другой стороны, счет за воду также штрафуется за просрочку платежа, но поскольку последний срок без просрочки платежа составляет 2015-03-01, значит, следующая дата платежа - 2015-03-01, а сумма - 200. Поскольку счет за газ не имеет опоздания плата, так что следующая дата платежа - 2015-02-01, хотя я просматриваю счет на 2015-03-01, а сумма платежа составляет 800.

Вопрос: Как сделать запрос SELECT для извлечения данных из таблицы базы данных для вывести вышеупомянутую неоплаченную таблицу счетов?

Я хочу использовать заявление 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

Я думаю, что здесь требуется нормализация. Ваша проблема вызвана избыточностью в таблице счетов, и вы должны отложить платежи за просрочку платежа в виде таблицы счетов - добавочные сборы за достижение конкретного уровня, не считая суммы счетов *. Таким образом, вы могли бы:

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 

*) часть нового latecharge таблицы на основе, например, для электроэнергии:

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, month, year, CASE WHEN bill_type = 'Electricity' или bill_type = 'Water' AND lastdate> = '$ today' THEN lastdate WHEN bill_type = 'Electricity' или bill_type = 'Water' AND lastdate1> = '$ today' THEN lastdate1 WHEN bill_type = 'Electricity' или bill_type = 'Water' AND lastdate2> = '$ today' THEN lastdate2 ELSE lastdate END as ldate –

Смежные вопросы