2014-03-06 79 views
0

我有如下表(這是我簡單的日期過濾查詢後得到)過濾相同的值 - 只需要一個 - 不使用CTE

現在我要顯示特定月份的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 | 

正如你可以看到,表格ID = 5,= 6是basicaly同一訂單,

只是š作爲一個銷售Optemunity,比(贏得後)變成了一個訂單,並再次存儲, ,因爲我試圖計算當月所有機會和訂單的總和,

我需要過濾掉這些雙精度值,而這樣做的:只服用了高價值的SalesOpportunityID其中SalesCycleStatus是=

訂購

(IF詛咒的有2項與同SalesOpportunityID,否則採取SalesAmount兩個用於SalesOpportunityID - regardles渡過SalesCycleStatus是訂購或機會)

有沒有辦法做到這一點不使用CTE? 非常感謝您的幫助:)!

+1

爲什麼你不希望使用CTE?你是否反對使用ROW_NUMBER()? – GarethD

+0

無不是真的對ROW_NUMBER() CTE就是這麼有問題的,因爲你不能真正與其他代碼中使用或加入它,我不想使用UNION – gberisha

+0

*你不能真的使用它其他代碼或加入它* - 你當然可以,如果你沒有遞歸使用它,這與子查詢沒有什麼不同。我懷疑你沒有正確使用它們! – GarethD

回答

1

你可以也能達到這個使用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; 
+0

非常感謝,幫我, 只有我不得不重寫ROWNUMBER這樣的: ROWNUMBER = ROW_NUMBER()OVER(PARTITION BY SalesOpportunityID ORDER BY CASE WHEN SalesCycleStatus = '機遇' THEN 1 ELSE 0 END,表格ID) – gberisha

+0

對不起,我的壞,它應該已經'情況下,當SalesCycleStatus ='訂購'然後0其他1結束',但如果你只有兩種可能的狀態是機會和秩序,那麼兩種方式都沒有關係。 – GarethD

1

有許多方法可以做到這一點:第一個我會建議將使用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例如

相關問題