如何在存储过程选择子句中使用 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 语句

跳出查询以在存储过程中从单独的表中获取 where 子句

如何在 SQL Server 的 IN 子句中使用存储过程输出

如何在 MySQL 中使用“WITH”子句?

如何使用SQL中的“With”子句更新值

Laravel - 使用“with”和“where”子句进行选择的查询