DB2 - 聚合游标中的大小写
DB2 - Aggregate with Case in Cursor
我正在尝试创建一个存储过程,它 return 是一个数据集,使用游标,它包含多个子查询的聚合函数。该查询在作为独立脚本执行时有效,但在使用游标将其放入存储过程格式时无效。使用聚合时,代码运行良好。在case语句上使用聚合时,创建存储过程失败。
输入Table数据:
Province | Contract Date
---------------------------
Ontario | June 11th, 2017
Ontario | June 21st, 2017
Quebec | July 12th, 2017
查询:
DECLARE C2 CURSOR WITH HOLD WITH RETURN TO CALLER FOR
SELECT
count(province) as province_total
FROM (
SELECT
contract.province,
contract.contract_date
WHERE contract.CON_CONTRACT_DATE >='2015-01-01'
AND contract.CON_CONTRACT_DATE < '2018-11-01'
);
Returns:
Province_Total |
----------------
3 |
所以这给了我省的总数。我正在尝试统计特定省份出现的次数。我正在使用以下查询这样做:
CREATE PROCEDURE test
DYNAMIC RESULT SETS 1
BEGIN
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT
count(province) as province_total,
sum(case province when 'Ontario' then 1.0 else 0.0 end) as ontario_total,
sum(case province when 'Quebec' then 1.0 else 0.0 end) as quebec_total
FROM (
SELECT
contract.province,
contract.contract_date
FROM dbo.contract as contract
WHERE contract.CON_CONTRACT_DATE >='2015-01-01'
AND contract.CON_CONTRACT_DATE < '2018-11-01'
);
OPEN C1;
END
我应该得到的是:
Province_Total | Ontario_Total | Quebec_Total
----------------------------------------------
3 | 2 | 1
但是我在尝试创建程序时遇到错误。具体来说:
SQL Error [42601]: An unexpected token "END-OF-STATEMENT" was found following "". Expected tokens may include: "".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.13.80
根据我在 DB2 上处理此错误消息的经验,当某些内容在语法上 "wrong" 时会抛出该错误消息。语句结束字符';'否则被识别。
有什么方法可以在 DB2 中获得我想要的结果吗?通常需要使用游标,因为我需要将结果设置为 return
如有任何建议,我们将不胜感激。谢谢。
编辑:使用 DB2 9.5
2个问题。
您必须将您的默认语句分隔符更改为示例中的一些新分隔符。
您的示例中缺少 FROM 子句。
如果您 运行 来自 DB2 CLP,应该是这样的。
--#SET TERMINATOR @
CREATE PROCEDURE test
DYNAMIC RESULT SETS 1
BEGIN
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT
count(province) as province_total,
sum(case province when 'Ontario' then 1.0 else 0.0 end) as ontario_total,
sum(case province when 'Quebec' then 1.0 else 0.0 end) as quebec_total
FROM (
SELECT
contract.province,
contract.contract_date
FROM MY_TABLE
WHERE contract.CON_CONTRACT_DATE >='2015-01-01'
AND contract.CON_CONTRACT_DATE < '2018-11-01'
);
OPEN C1;
END@
我正在尝试创建一个存储过程,它 return 是一个数据集,使用游标,它包含多个子查询的聚合函数。该查询在作为独立脚本执行时有效,但在使用游标将其放入存储过程格式时无效。使用聚合时,代码运行良好。在case语句上使用聚合时,创建存储过程失败。
输入Table数据:
Province | Contract Date
---------------------------
Ontario | June 11th, 2017
Ontario | June 21st, 2017
Quebec | July 12th, 2017
查询:
DECLARE C2 CURSOR WITH HOLD WITH RETURN TO CALLER FOR
SELECT
count(province) as province_total
FROM (
SELECT
contract.province,
contract.contract_date
WHERE contract.CON_CONTRACT_DATE >='2015-01-01'
AND contract.CON_CONTRACT_DATE < '2018-11-01'
);
Returns:
Province_Total |
----------------
3 |
所以这给了我省的总数。我正在尝试统计特定省份出现的次数。我正在使用以下查询这样做:
CREATE PROCEDURE test
DYNAMIC RESULT SETS 1
BEGIN
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT
count(province) as province_total,
sum(case province when 'Ontario' then 1.0 else 0.0 end) as ontario_total,
sum(case province when 'Quebec' then 1.0 else 0.0 end) as quebec_total
FROM (
SELECT
contract.province,
contract.contract_date
FROM dbo.contract as contract
WHERE contract.CON_CONTRACT_DATE >='2015-01-01'
AND contract.CON_CONTRACT_DATE < '2018-11-01'
);
OPEN C1;
END
我应该得到的是:
Province_Total | Ontario_Total | Quebec_Total
----------------------------------------------
3 | 2 | 1
但是我在尝试创建程序时遇到错误。具体来说:
SQL Error [42601]: An unexpected token "END-OF-STATEMENT" was found following "". Expected tokens may include: "".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.13.80
根据我在 DB2 上处理此错误消息的经验,当某些内容在语法上 "wrong" 时会抛出该错误消息。语句结束字符';'否则被识别。
有什么方法可以在 DB2 中获得我想要的结果吗?通常需要使用游标,因为我需要将结果设置为 return
如有任何建议,我们将不胜感激。谢谢。
编辑:使用 DB2 9.5
2个问题。
您必须将您的默认语句分隔符更改为示例中的一些新分隔符。
您的示例中缺少 FROM 子句。
如果您 运行 来自 DB2 CLP,应该是这样的。
--#SET TERMINATOR @
CREATE PROCEDURE test
DYNAMIC RESULT SETS 1
BEGIN
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT
count(province) as province_total,
sum(case province when 'Ontario' then 1.0 else 0.0 end) as ontario_total,
sum(case province when 'Quebec' then 1.0 else 0.0 end) as quebec_total
FROM (
SELECT
contract.province,
contract.contract_date
FROM MY_TABLE
WHERE contract.CON_CONTRACT_DATE >='2015-01-01'
AND contract.CON_CONTRACT_DATE < '2018-11-01'
);
OPEN C1;
END@