1

我向已经有很多行的 DailyTotals 表添加了四个新列,我需要通过查询所有每日典当交易来为新列填充每行的每日总计。

DailyTotals 表如下所示:

    tblDailyTotals
    (
    dt_date DATE,       {unique index}
    ...
    dt_P_count INT,
    dt_P_amt DECIMAL(8,2),
    dt_X_count INT,
    dt_X_amt DECIMAL(8,2)
    );

Pawn Transactions 表如下所示:

    tblPawnTransactions
    (
    ...
    pt_date DATE,       {dups index}
    pt_type CHAR(1), {"P","X"}
    pt_amt DECIMAL(7,2)
    );

您将如何对批量更新查询进行编码以填充 DailyTotals 表中每个每日行的四个新列?

4

1 回答 1

2

这是一些有效的 Informix SQL。它假定您在环境中设置了 DBDATE='Y4MD-' 或等效设置 - 您需要调整日期格式以适合您的偏好。

设置

CREATE TABLE    tblDailyTotals
    (
    dt_date DATE PRIMARY KEY NOT NULL,       {unique index}
    dt_other CHAR(20) NOT NULL,
    dt_P_count INT,
    dt_P_amt DECIMAL(8,2),
    dt_X_count INT,
    dt_X_amt DECIMAL(8,2)
    );


CREATE TABLE   tblPawnTransactions
    (
    pt_customer INT,
    pt_date DATE,       {dups index}
    pt_type CHAR(1), {"P","X"}
    pt_amt DECIMAL(7,2)
    );

INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-01', 'Other info 2017-01-01');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-02', 'Other info 2017-01-02');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-03', 'Other info 2017-01-03');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-04', 'Other info 2017-01-04');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-05', 'Other info 2017-01-05');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-06', 'Other info 2017-01-06');
UPDATE tblDailyTotals
   SET dt_P_count = 3, dt_P_amt = 345.67, dt_X_count = 9, dt_X_amt = 291.23
 WHERE dt_date = '2017-01-06';

INSERT INTO tblPawnTransactions VALUES(1, '2017-01-01', 'P', 12.34);
INSERT INTO tblPawnTransactions VALUES(2, '2017-01-01', 'P', 22.25);
INSERT INTO tblPawnTransactions VALUES(3, '2017-01-01', 'X', 32.16);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-02', 'P', 42.07);
INSERT INTO tblPawnTransactions VALUES(4, '2017-01-02', 'P', 52.98);
INSERT INTO tblPawnTransactions VALUES(2, '2017-01-02', 'X', 62.89);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-03', 'P', 72.70);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-03', 'X', 82.51);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-03', 'P', 92.42);
INSERT INTO tblPawnTransactions VALUES(2, '2017-01-05', 'X', 13.33);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-05', 'P', 14.14);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-05', 'X', 15.05);

更新

SELECT * FROM tblDailyTotals ORDER BY dt_date;

UPDATE tblDailyTotals
   SET (dt_P_count, dt_P_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'P'
                                ))
 WHERE EXISTS(SELECT * FROM tblPawnTransactions AS pt
               WHERE pt.pt_date = tblDailyTotals.dt_date AND pt_type = 'P')
;

UPDATE tblDailyTotals
   SET (dt_X_count, dt_X_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'X'
                                ))
 WHERE EXISTS(SELECT * FROM tblPawnTransactions AS pt
               WHERE pt.pt_date = tblDailyTotals.dt_date AND pt_type = 'X')
;

双括号是必需的;外对表示 SET 子句的 RHS 上有一个值列表,以匹配 SET 子句的 LHS 括号中的列列表,而内括号表示这些值是 SELECT 语句的结果.

样本数据的输出

更新前:

2017-01-01  Other info 2017-01-0
2017-01-02  Other info 2017-01-0
2017-01-03  Other info 2017-01-0
2017-01-04  Other info 2017-01-0
2017-01-05  Other info 2017-01-0
2017-01-06  Other info 2017-01-0    3   345.67      9  291.23

更新后:

2017-01-01  Other info 2017-01-0    2   34.59       1   32.16
2017-01-02  Other info 2017-01-0    2   95.05       1   62.89
2017-01-03  Other info 2017-01-0    2   165.12      1   82.51
2017-01-04  Other info 2017-01-0
2017-01-05  Other info 2017-01-0    1   14.14       2   28.38
2017-01-06  Other info 2017-01-0    3   345.67      9  291.23

为什么是 EXISTS 子句?

如果省略WHERE EXISTS(…)子句会发生什么?表中没有匹配条目的行tblPawnTransactions也会更新,如下所示:

SELECT * FROM tblDailyTotals ORDER BY dt_date;

UPDATE tblDailyTotals
   SET (dt_P_count, dt_P_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'P'
                                ))
 ;

UPDATE tblDailyTotals
   SET (dt_X_count, dt_X_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'X'
                                ))
 ;

SELECT * FROM tblDailyTotals ORDER BY dt_date;

这会产生:

2017-01-01  Other info 2017-01-0    2   34.59       1   32.16
2017-01-02  Other info 2017-01-0    2   95.05       1   62.89
2017-01-03  Other info 2017-01-0    2   165.12      1   82.51
2017-01-04  Other info 2017-01-0    0               0
2017-01-05  Other info 2017-01-0    1   14.14       2   28.38
2017-01-06  Other info 2017-01-0    0               0

请注意,2017-01-04 和 2017-01-06 的行都已更新。现在,如果你想要那些零和空值,那很好。如果不是,请使用 EXISTS 子句。

于 2017-05-05T17:41:18.960 回答