Sql 过滤相同的值-仅取一个-不使用CTE
我有下表(在一个简单的日期过滤器查询后得到) 现在,我想显示给定月份的SalesAmount,尽管在某些情况下,同一ID有多个值,在这种情况下,需要忽略一个值,而取另一个值,否则(如果ID只有一个条目,则应取该值) 如您所见,TableID=5和=6基本上是相同的顺序 作为销售商品存储,然后(在赢得后)变成订单并再次存储, 因为我正在计算当月所有机会和订单的总和 我需要过滤掉这些双值,方法是:仅获取SalesCycleStatus为=Order的SalesOpportunityID的值 (如果有两个条目具有相同的SalesOpportunityID,否则为SalesOpportunityID获取SalesAmount-考虑SalesCycleStatus是订单还是商机) 有没有一种不用CTE的方法?Sql 过滤相同的值-仅取一个-不使用CTE,sql,sql-server,filter,Sql,Sql Server,Filter,我有下表(在一个简单的日期过滤器查询后得到) 现在,我想显示给定月份的SalesAmount,尽管在某些情况下,同一ID有多个值,在这种情况下,需要忽略一个值,而取另一个值,否则(如果ID只有一个条目,则应取该值) 如您所见,TableID=5和=6基本上是相同的顺序 作为销售商品存储,然后(在赢得后)变成订单并再次存储, 因为我正在计算当月所有机会和订单的总和 我需要过滤掉这些双值,方法是:仅获取SalesCycleStatus为=Order的SalesOpportunityID的值 (如果有
非常感谢你的帮助:) 有很多方法可以做到这一点:我建议的第一种方法是使用
notexists
的子查询,如下所示:
SELECT TableID, SalesOpportunityID, OrderID, SalesCycleStatus, Status, SalesAmount
FROM TestTable
WHERE
SalesCycleStatus = 'Order' OR
NOT EXISTS
(
SELECT TableID
FROM TestTable sub
WHERE
SalesCycleStatus = 'Order' AND
sub.SalesOpportunityID = TestTable.SalesOpportunityID
)
单击此处查看完整示例您也可以使用
ROW\u number()
实现此功能,因为它只需要一次表格扫描,因此效率更高:
SELECT TableID,
SalesOpportunityID,
OrderID,
SalesCycleStatus,
Status,
SalesAmount
FROM ( SELECT TableID,
SalesOpportunityID,
OrderID,
SalesCycleStatus,
Status,
SalesAmount ,
RowNumber = ROW_NUMBER() OVER(PARTITION BY SalesOpportunityID
ORDER BY CASE WHEN SalesCycleStatus = 'Order' THEN 1 ELSE 0 END, TableID)
FROM T
) t
WHERE t.RowNumber = 1;
你为什么不想用CTE?你也反对使用ROW_NUMBER()吗?不,不是真的反对ROW_NUMBER(),CTE问题太大了,因为你不能将它与其他代码一起使用,也不能加入它,我不想使用Union,你不能将它与其他代码一起使用,也不能加入它——当然可以,如果你不递归使用它,它与子查询没有什么不同。我怀疑你没有正确使用它们!非常感谢,帮助了我,只是我不得不像这样重写RowNumber:RowNumber=ROW_NUMBER()OVER(当SalesCycleStatus='Opportunity'然后1 ELSE 0 END,TableID时按SalesOpportunityID按案例进行分区)对不起,我的错,当SalesCycleStatus='ORDER'然后0 ELSE 1 END时应该是
CASE,但是,如果您只有两种可能的状态是opportunity和order,那么这两种状态都无关紧要。
SELECT TableID,
SalesOpportunityID,
OrderID,
SalesCycleStatus,
Status,
SalesAmount
FROM ( SELECT TableID,
SalesOpportunityID,
OrderID,
SalesCycleStatus,
Status,
SalesAmount ,
RowNumber = ROW_NUMBER() OVER(PARTITION BY SalesOpportunityID
ORDER BY CASE WHEN SalesCycleStatus = 'Order' THEN 1 ELSE 0 END, TableID)
FROM T
) t
WHERE t.RowNumber = 1;