我有以下payments_2015表:SQLITE:如何在UPDATE語句中使用SELECT語句更新表?
ref-no |Jan |Feb |Mar |Apr |May |Jun
1 | |PAID |PAID | |PAID |
2 | |PAID | | | |PAID
3 |PAID | |PAID |PAID |PAID |PAID
4 |PAID |PAID | |PAID |PAID |
5 |PAID | |PAID | | |
6 | | | | | |PAID
我檢查每個ref_no多少個月使用下面的查詢不支付:
for(int i = 0; i < all_refNo_list.size(); i++) {
qryTxt = "INSERT INTO late_payments "
"select ref_no AS ref_no, sum(i_count) as unpaid_count from ("
"SELECT ref_no, CASE WHEN January = 'PAID' THEN 0 ELSE 1 END AS i_count, 1 AS month_no FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN February = 'PAID' THEN 0 ELSE 1 END , 2 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN March = 'PAID' THEN 0 ELSE 1 END , 3 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN April = 'PAID' THEN 0 ELSE 1 END , 4 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN May = 'PAID' THEN 0 ELSE 1 END , 5 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN June = 'PAID' THEN 0 ELSE 1 END , 6 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN July = 'PAID' THEN 0 ELSE 1 END , 7 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN August = 'PAID' THEN 0 ELSE 1 END , 8 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN September = 'PAID' THEN 0 ELSE 1 END , 9 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN October = 'PAID' THEN 0 ELSE 1 END , 10 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN November = 'PAID' THEN 0 ELSE 1 END , 11 FROM payments_" + getCurrentYear() +
" UNION SELECT ref_no, CASE WHEN December = 'PAID' THEN 0 ELSE 1 END , 12 FROM payments_" + getCurrentYear() +
") A Where ref_no = " + all_refNo_list[i];
query.prepare(qryTxt);
if (!query.exec())
{
qDebug() << "Error" << query.lastError().text();
}
}
結果如下late_payments
表:
ref_no |unpaid_count
1 |3
2 |4
3 |1
4 |2
5 |4
6 |5
現在,如果我在1月爲ref_no = 1插入'PAID',結果仍然相同。當然,它會保持不變,因爲我插入已經存在的記錄而不是更新。
對於特定的'ref_no',每月檢查爲'PAID'時,我無法更新這些值。即:只要有變化就更新表格。
UPDATE:
我已經試過如下:
for(int i = 0; i < getAllRefNoList().size(); i++) {
qryTxt = "UPDATE late_payments "
"SET unpaid_count = ("
"select sum(i_count) as unpaid_count from ("
"SELECT CASE WHEN January = 'PAID' THEN 0 ELSE 1 END AS i_count, 1 AS month_no FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN February = 'PAID' THEN 0 ELSE 1 END , 2 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN March = 'PAID' THEN 0 ELSE 1 END , 3 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN April = 'PAID' THEN 0 ELSE 1 END , 4 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN May = 'PAID' THEN 0 ELSE 1 END , 5 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN June = 'PAID' THEN 0 ELSE 1 END , 6 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN July = 'PAID' THEN 0 ELSE 1 END , 7 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN August = 'PAID' THEN 0 ELSE 1 END , 8 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN September = 'PAID' THEN 0 ELSE 1 END , 9 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN October = 'PAID' THEN 0 ELSE 1 END , 10 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN November = 'PAID' THEN 0 ELSE 1 END , 11 FROM payments_" + getCurrentYear() +
" UNION SELECT CASE WHEN December = 'PAID' THEN 0 ELSE 1 END , 12 FROM payments_" + getCurrentYear() +
") A WHERE ref_no = " + getAllRefNoList()[i] + ")";
query.prepare(qryTxt);
if (!query.exec())
{
qDebug() << "Error" << query.lastError().text();
}
但沒有成功..
PS:我實現了一個C Qt的這些選擇語句++應用。我使用QSqlQueryModel
在QTableView
上顯示選擇語句的結果。
貴UPDATE工作?你會得到什麼錯誤?你還試過了什麼? – nicomp
您的select語句返回兩個值,但您只想更新一個值 - 請嘗試'SELECT count FROM WHERE ref_no = 1'。 –
嘗試用'UPDATE B SET count =(SELECT count FROM WHERE ref_no = 1)AS C' – Ibrahim