在SQL中的一行中列出多个列

在SQL中的一行中列出多个列,sql,sql-server,database,Sql,Sql Server,Database,你好, 在上面的查询中,我想获得seqnum=1和seqnum=2的事务id行 但是如果该事务id没有第二行(seqnum=2),我不想为该事务id获取任何行 谢谢 像这样的 (select ID,EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE,ROW_NUMBER() OVER(PARTITION BY EXTERNAL_TRANSACTION_ID ORDER BY ID ) AS SEQNUM from AC_POS_TRANSACTIO

你好,

在上面的查询中,我想获得seqnum=1和seqnum=2的事务id行

但是如果该事务id没有第二行(seqnum=2),我不想为该事务id获取任何行

谢谢

像这样的

(select ID,EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE,ROW_NUMBER() OVER(PARTITION BY EXTERNAL_TRANSACTION_ID ORDER BY ID ) AS SEQNUM
from AC_POS_TRANSACTION_TRK aptt WHERE [RESULT] ='Success'
GROUP BY ID, EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE )

如果没有表定义,则无法100%确定这是否正确,但我的理解是,如果记录的条目为seqnum=2,则需要排除该记录——不能单独使用where子句,因为该子句仍将返回seqnum=1

您可以像这样使用exists/not exists或in/not in子句

(select ID,EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE,ROW_NUMBER() OVER(PARTITION BY EXTERNAL_TRANSACTION_ID ORDER BY ID ) AS SEQNUM
from AC_POS_TRANSACTION_TRK aptt WHERE [RESULT] ='Success'
GROUP BY ID, EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE )

基本上,如果一条记录按照NOT exists查询中的指定存在,则它将排除该记录。

这应该可以完成该工作

 (select ID,EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE,ROW_NUMBER() OVER(PARTITION BY EXTERNAL_TRANSACTION_ID ORDER BY ID ) AS SEQNUM
    from AC_POS_TRANSACTION_TRK aptt WHERE [RESULT] ='Success'
    
 and not exists ( select 1 from  AC_POS_TRANSACTION_TRK a where a.id = aptt.id 
                     and a.seqnum = 2)

    GROUP BY ID, EXTERNAL_TRANSACTION_ID,EXTERNAL_TRANSACTION_TYPE )

顺便说一句,我觉得您原来的查询有问题,特别是我认为这些列应该位于OVER语句的PARTITION BY子句中,而不是GROUP BY columns,但是不知道更多关于表结构的信息以及您要实现的目标,我不能肯定。

您可以尝试的一个选项是使用相同的分区标准为每个组添加行数,然后进行相应的筛选。如果不在上下文和示例数据中查看查询,就不能完全确定查询-没有聚合,那么为什么要使用
分组依据

然而,你能尝试一下这些方法吗

With Qry As (
    -- Your original query goes here
),
Select Qry.* 
From Qry 
Where Exists (
    Select * 
    From Qry Qry1 
    Where Qry1.EXTERNAL_TRANSACTION_ID = Qry.EXTERNAL_TRANSACTION_ID 
    And Qry1.SEQNUM = 1
)
And Exists (
    Select * 
    From Qry Qry2 
    Where Qry2.EXTERNAL_TRANSACTION_ID = Qry.EXTERNAL_TRANSACTION_ID 
    And Qry2.SEQNUM = 2
)

那么,您的问题是什么?您要添加到查询中的是Exists语句。因此,您要的是每个组没有行或每个组有2行(或至少2行),是吗?不存在?我猜是存在的,因为显示的行应该有一个.seqnum=2您好,我得到了下面的错误“无效列名'seqnum.”谢谢您的解决方案我得到了要点:)实际上,我的目标是如果任何事务id有seqnum 1和2,列出该行,如果事务id只有seqnum=1,则不显示该行。