我有下表(在简单的日期筛选查询之后得到)
现在我想显示给定月份的SalesAmount,尽管在某些情况下我有多个相同ID的值,在这种情况下,一个需要被忽略,另一个需要被接受,否则(如果ID只有一个条目,则应该使用该值)
| 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就能做到这一点?非常感谢你的帮助:)!
发布于 2014-03-06 14:02:03
您还可以使用ROW_NUNBER()实现这一点,因为它只需要一次表扫描,因此效率更高:
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;发布于 2014-03-06 13:28:28
有许多方法可以做到这一点:我建议的第一个方法是使用NOT EXISTS进行子查询,如下所示:
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示例
https://stackoverflow.com/questions/22225387
复制相似问题