c++ - SQLITE:如何在 UPDATE 语句中使用 SELECT 语句更新表?

标签 c++ sql qt sqlite sql-update

我有以下 payments_2015 表:

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”时,我都无法更新这些值。即:只要有变化就更新表。

更新:

我试过以下方法:

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();
        }

但是没有成功..

附注:我正在 Qt 上为一个 c++ 应用程序实现这些选择语句。我正在使用 QSqlQueryModelQTableView 上显示选择语句的结果。

最佳答案

首先,创建一个查询来计算所需的表:

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

然后您可以删除该表,而是使用动态生成这些结果的 View :

CREATE VIEW late_payments_2015 AS
SELECT ...;

关于c++ - SQLITE:如何在 UPDATE 语句中使用 SELECT 语句更新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34483499/

相关文章:

c++ - 编译器错误 : No appropriate default constructor avaible

c++ - g++ "does not name a type"错误

c++ - Qt4.8 : Why enum not seen in qmetaobject? 以及如何工作?

c++ - 如何将 QProgressBar 链接到终端进程百分比?

c++ - 在Windows上使用Qt和opencv构建问题

c++ - 包括 DShow.h 会破坏 BDS2006 上的 VCL AnsiString::sprintf()

php - 用户注册失败后保留表单值

c++ - 通过代码添加具有可编辑属性的小部件

java - 使用内部联接查询运行 count() 时,Room 返回包含一项的列表,而不是空列表

非唯一重复项的 SQL 查询帮助