如何填充新列?
How can I populate new columns?
我向已经有很多行的 DailyTotals table 添加了四个新列,我需要通过查询所有每日典当交易,用每行的每日总计填充新列。
DailyTotals table 看起来像这样:
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)
);
典当交易 table 看起来像这样:
tblPawnTransactions
(
...
pt_date DATE, {dups index}
pt_type CHAR(1), {"P","X"}
pt_amt DECIMAL(7,2)
);
您将如何编写批量更新查询代码以填充 DailyTotals 中每一天的四个新列 table?
这是一些可用的 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 上括号中的列列表,而内括号表示值是 [= 的结果41=]声明。
示例数据的输出
更新前:
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
table 中没有匹配条目的行也会更新,如下所示:
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 子句。
我向已经有很多行的 DailyTotals table 添加了四个新列,我需要通过查询所有每日典当交易,用每行的每日总计填充新列。
DailyTotals table 看起来像这样:
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)
);
典当交易 table 看起来像这样:
tblPawnTransactions
(
...
pt_date DATE, {dups index}
pt_type CHAR(1), {"P","X"}
pt_amt DECIMAL(7,2)
);
您将如何编写批量更新查询代码以填充 DailyTotals 中每一天的四个新列 table?
这是一些可用的 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 上括号中的列列表,而内括号表示值是 [= 的结果41=]声明。
示例数据的输出
更新前:
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
table 中没有匹配条目的行也会更新,如下所示:
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 子句。