这是一些有效的 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 子句。