2017-02-03 63 views
0

下午,我有以下SQL命令:輸入取決於行標準的特定數據

SELECT INVOICE_ID, ITEM_ID, ORDER_NO, CLIENT_STATE FROM CUSTOMER_ORDER_INV_JOIN WHERE ORDER_NO = '* 1007';

這翻出了以下信息:

[在這裏輸入的形象描述] [1]

還有就是我想達到特定的標準,那就是以下幾點:

在訂否:* 1007,如果客戶端狀態爲所有行= PaidPosted,則需要另一列在所有行上顯示「PaidPosted」。 但是,在訂單號:* 1007,如果客戶狀態4條線='PaidPosted',但1條或更多的行='PostedAuth',那麼我需要另一列,所有行顯示'PostedAuth'。但是,如果所有行都是NULL,我需要一個列,其中所有行都顯示「No Invoice」。

希望這樣做更有意義。

+1

提供樣本數據和預期的輸出。 – GurV

+0

嗨,我以爲我有。我想從中看到的只是張貼標籤顯示,但是我希望能夠將其更改爲PostsAuth1。 –

+0

*我希望能夠將此更改爲張貼摘要1 * - 您的意思是什麼?這不像你想象的那麼清楚。 – GurV

回答

0

我認爲這會得到你所需要的。 您可以創建具有您的排序順序臨時表:

CREATE TABLE #Sort_Order 
(myOrder INT, 
CLIENT_STATE NVARCHAR(20) 
) 

INSERT INTO #Sort_Order 
VALUES(1, 'Preliminary') 
INSERT INTO #Sort_Order 
VALUES(2, 'PostedAuth') 
INSERT INTO #Sort_Order 
VALUES(3, 'PaidPosted') 

然後,你可以它加入到你的表和運行RANK函數就可以了,像這樣:

SELECT 
A.*, 
DENSE_RANK() OVER (PARTITION BY A.ID 
        ORDER BY B.myOrder ASC) AS OrderRank 
FROM #Temp A 
INNER JOIN #Sort_Order B On (A.CLIENT_STATE = B.CLIENT_STATE) 
WHERE A.ID = 1 

這會給你RANK的結果,並且可以使用WHERE語句僅過濾RANK = 1

如果您的數據具有多行相同的客戶端狀態,則需要執行某種類型的DISTINCT或GROUP BY。