首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >筛选相同的值-只接受一个-而不使用CTE

筛选相同的值-只接受一个-而不使用CTE
EN

Stack Overflow用户
提问于 2014-03-06 13:03:10
回答 2查看 36关注 0票数 0

我有下表(在简单的日期筛选查询之后得到)

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

代码语言:javascript
复制
| TableID |SalesOpportunityID| OrderID | SalesCycleStatus | Status | SalesAmount | OrderIncMonth |
|    1    |   14551          |  NULL   |     Oppurtunity  |  Lost  |    1556,316 |     2013-10   |
|    2    |   12551          |  14515  |       Order      | Active |   23563,23  |     2013-10   |
|    3    |   12151          |  15131  |       Order      | Active |  2212352,43 |     2013-10   |
|    4    |   14531          |  NULL   |     Opportunity  |  Lost  | 32152332,1  |     2013-10   |

|    5    |   12651          |  NULL   |     Opportunity  |  Won   |   23525,3245|     2013-10   |
|    6    |   12651          |  21452  |       Order      | Active |   23525,3245|     2013-10   |

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

只是作为销售Opurtunity存储,而不是(在它被赢得后)变成订单并再次存储,因为我正在试图计算当前这个月所有的订单和订单的总和,

我需要过滤出这些双值,并通过这样做:只获取SalesOpportunityID的值,其中SalesCycleStatus = Order

(如果诅咒有两个条目与相同的SalesOpportunityID,否则以SalesAmount为SalesOpportunityID -考虑是否SalesCycleStatus是一个命令或一个机会)

有没有办法不使用CTE就能做到这一点?非常感谢你的帮助:)!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-06 14:02:03

您还可以使用ROW_NUNBER()实现这一点,因为它只需要一次表扫描,因此效率更高:

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2014-03-06 13:28:28

有许多方法可以做到这一点:我建议的第一个方法是使用NOT EXISTS进行子查询,如下所示:

代码语言:javascript
复制
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
    )

单击此处获取完整的SQL Fiddle示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22225387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档