2015-12-27 309 views
0

我有以下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的這些選擇語句++應用。我使用QSqlQueryModelQTableView上顯示選擇語句的結果。

+1

貴UPDATE工作?你會得到什麼錯誤?你還試過了什麼? – nicomp

+1

您的select語句返回兩個值,但您只想更新一個值 - 請嘗試'SELECT count FROM WHERE ref_no = 1'。 –

+0

嘗試用'UPDATE B SET count =(SELECT count FROM WHERE ref_no = 1)AS C' – Ibrahim

回答

1

首先,創建一個查詢計算所需的表:

SELECT refno, 
     (ifnull(Jan, '') != 'PAID') + 
     (ifnull(Feb, '') != 'PAID') + 
     ... 
     (ifnull(Dec, '') != 'PAID) AS unpaid_count 
FROM payments_2015; 

然後你就可以刪除該表,而是使用產生這些結果動態視圖:

CREATE VIEW late_payments_2015 AS 
SELECT ...; 
+0

非常感謝..你的陳述比我的寫作和追蹤更容易... –

1

爲你的SELECT語句UPDATE語句:

UPDATE A 
    SET COUNT = <your value> 
WHERE ref_no = 1 
+0

感謝您的回答。但是,我知道UPDATE語句的語法。這是混合'SELECT'與'UPDATE'在同一個查詢中,我正在努力... –

+0

''這裏是'SELECT'語句,但你的解決方案沒有工作 –

1

它看起來就像你有兩個表在這裏。一種方法是:

update b 
    set count = (select count from a where ref_no = 1); 

這將更新b中的所有行。你的問題並沒有建議任何方式將其限制爲一行或幾行。

+0

你是對的我沒有指定行數。請查看問題更新以獲取更多解釋。 –

+0

我很抱歉你的答案沒有工作,因爲我有兩個級別的SELECT語句。你答案中的'a'是另一個'SELECT'語句。 –