如何在存储过程选择子句中使用 with 子句 CTE 表达式常见
Posted
技术标签:
【中文标题】如何在存储过程选择子句中使用 with 子句 CTE 表达式常见【英文标题】:How to use with clause CTE expression in stored procedure select clause common 【发布时间】:2021-04-06 05:54:53 【问题描述】:with cte as
(
select trd_nbr,[date],sum(case when txn_typ='A' then abs(amount) else 0 end)
amountforA,
sum(case when txn_typ='B' then abs(amount) else 0 end) amountforB,
sum(case when txn_typ='C' then abs(amount) else 0 end) amountforC
from table1
group by trd_nbr,[date]
)
select trd_nbr,[date],
(case when amountforA=amountforB and amountforB=amountforC then amountforC
else amountforA-amountforC end) Amount,
(case when amountforA=amountforB and amountforB=amountforC then 'M' else
'NM' end) Matched
from cte WHERE amountforA>0 and amountforB>0 and amountforC>0
如何在存储过程中使用上述查询?
create proc proc name()
begin
select amount, matched ,...from table1
where condition..
union all
select column1, column2.... from table2
where condition..
end;
这里的数量和匹配列取自 with 子句。怎么用啊。。
【问题讨论】:
请向我们展示您的尝试并解释您遇到的问题。看起来非常相似,如果与您最近关闭的问题不同的话。你不应该再问同样的问题,而是改进你的问题并等待它被重新打开。 你earlier question的答案有什么问题? 你想要的输出是什么? trd_nbr|日期|金额| |:----:|:----:|:---- |1 |2/5/21| 4000 |2 |8/12/21 |5000 ? 【参考方案1】:我不确定我是否理解正确。如果这不是您要查找的内容,请在单个表中分享您想要的输出。
架构和插入语句:
create table table1(trd_nbr int, date date,amount int, txn_typ varchar(10));
insert into table1 values(1, '2/5/21', 4000, 'A');
insert into table1 values(1, '2/5/21', -4000, 'B');
insert into table1 values(1, '2/5/21', 2000, 'C');
insert into table1 values(1, '2/5/21', 2000, 'C');
insert into table1 values(2, '8/12/21', 10000, 'A');
insert into table1 values(2, '8/12/21', -5000, 'B');
insert into table1 values(2, '8/12/21', 5000, 'C');
insert into table1 values(1 ,'2/5/21',4000 ,'A' );
insert into table1 values(2 ,'5/3/21',-3000 ,'B' );
insert into table1 values(4 ,'2/5/21', 2000 ,'Z' );
GO
查询#1(使用公用表表达式)
with cte as
(
select trd_nbr,[date],sum(case when txn_typ='A' then abs(amount) else 0 end) amountforA,
sum(case when txn_typ='B' then abs(amount) else 0 end) amountforB,
sum(case when txn_typ='C' then abs(amount) else 0 end) amountforC
from table1
group by trd_nbr,[date]
)
select trd_nbr,[date],
(case when amountforA=amountforB and amountforB=amountforC then amountforC else amountforA-amountforC end) Amount,
(case when amountforA=amountforB and amountforB=amountforC then 'M' else 'NM' end) Matched
from cte WHERE amountforA0 and amountforB0 and amountforC0
输出:
trd_nbr | date | Amount | Matched |
---|---|---|---|
1 | 2021-02-05 | 4000 | NM |
2 | 2021-08-12 | 5000 | NM |
查询#2(使用子查询)
select trd_nbr,[date], *,
(case when amountforA=amountforB and amountforB=amountforC then amountforC else amountforA-amountforC end) Amount,
(case when amountforA=amountforB and amountforB=amountforC then 'M' else 'NM' end) Matched
from
(
select trd_nbr,[date],sum(case when txn_typ='A' then abs(amount) else 0 end) amountforA,
sum(case when txn_typ='B' then abs(amount) else 0 end) amountforB,
sum(case when txn_typ='C' then abs(amount) else 0 end) amountforC
from table1
group by trd_nbr,[date]
)t
WHERE amountforA0 and amountforB0 and amountforC0
输出:
trd_nbr | date | Amount | Matched |
---|---|---|---|
1 | 2021-02-05 | 4000 | NM |
2 | 2021-08-12 | 5000 | NM |
db小提琴here
【讨论】:
其实我想在 store proc where 子句中实现这个...过滤条件.. 是否可以为匹配记录'M'和不匹配记录'NM'创建标志..跨度> 它就像 SQL Server 2005 中的魅力一样工作。您可能无法将此查询与查询的其他部分连接起来。我还通过使用子查询而不是公用表表达式来修改我的答案。 不客气。那么请接受 tji 的回答。 @RagavendraDevraj 你熟悉接受答案吗? 我可以试一试。请与此查询失败的所需输出共享一些示例数据。以上是关于如何在存储过程选择子句中使用 with 子句 CTE 表达式常见的主要内容,如果未能解决你的问题,请参考以下文章
根据 with 子句中的条件选择要使用的 select 语句