Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 过滤相同的值-仅取一个-不使用CTE_Sql_Sql Server_Filter - Fatal编程技术网

Sql 过滤相同的值-仅取一个-不使用CTE

Sql 过滤相同的值-仅取一个-不使用CTE,sql,sql-server,filter,Sql,Sql Server,Filter,我有下表(在一个简单的日期过滤器查询后得到) 现在,我想显示给定月份的SalesAmount,尽管在某些情况下,同一ID有多个值,在这种情况下,需要忽略一个值,而取另一个值,否则(如果ID只有一个条目,则应取该值) 如您所见,TableID=5和=6基本上是相同的顺序 作为销售商品存储,然后(在赢得后)变成订单并再次存储, 因为我正在计算当月所有机会和订单的总和 我需要过滤掉这些双值,方法是:仅获取SalesCycleStatus为=Order的SalesOpportunityID的值 (如果有

我有下表(在一个简单的日期过滤器查询后得到)

现在,我想显示给定月份的SalesAmount,尽管在某些情况下,同一ID有多个值,在这种情况下,需要忽略一个值,而取另一个值,否则(如果ID只有一个条目,则应取该值)

如您所见,TableID=5和=6基本上是相同的顺序

作为销售商品存储,然后(在赢得后)变成订单并再次存储, 因为我正在计算当月所有机会和订单的总和

我需要过滤掉这些双值,方法是:仅获取SalesCycleStatus为=Order的SalesOpportunityID的值

(如果有两个条目具有相同的SalesOpportunityID,否则为SalesOpportunityID获取SalesAmount-考虑SalesCycleStatus是订单还是商机)

有没有一种不用CTE的方法?
非常感谢你的帮助:)

有很多方法可以做到这一点:我建议的第一种方法是使用
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;