2017-11-11 82 views
0

我現在的問題是,我有一個表格,其中的數據已經根據一些規則進行了排序(進一步討論),我必須編寫一個查詢來實現進一步的排序。我想有條件地對錶格進行排序

樣品表:

PBaseIDOrder SecuritySymbol TradeDate     TransactionCode rownum 
1    13033w7l1  2017-01-06 00:00:00.000   li   76 
1    13033w7l1  2017-01-06 00:00:00.000   pa   77 
1    13033w7l1  2017-01-06 00:00:00.000   li   78 
1    13033w7l1  2017-01-06 00:00:00.000   pa   79 
1    13033w7l1  2017-01-06 00:00:00.000   li   80 
1    13033w7l1  2017-01-06 00:00:00.000   pa   81 
1    13033w7l1  2017-06-01 00:00:00.000   in   82 
1    542433ry5  2017-01-06 00:00:00.000   pa   329 
1    542433ry5  2017-01-06 00:00:00.000   li   330 
1    542433ry5  2017-01-11 00:00:00.000   sl   331 
1    542433ry5  2017-01-11 00:00:00.000   sa   332 

輸出,我從查詢想: 樣品表:

PBaseIDOrder SecuritySymbol TradeDate     TransactionCode rownum 
1    13033w7l1  2017-01-06 00:00:00.000   li   76 
1    13033w7l1  2017-01-06 00:00:00.000   pa   77 
1    13033w7l1  2017-01-06 00:00:00.000   li   78 
1    13033w7l1  2017-01-06 00:00:00.000   pa   79 
1    13033w7l1  2017-01-06 00:00:00.000   li   80 
1    13033w7l1  2017-01-06 00:00:00.000   pa   81 
1    13033w7l1  2017-06-01 00:00:00.000   in   82 
1    542433ry5  2017-01-06 00:00:00.000   li   330 
1    542433ry5  2017-01-06 00:00:00.000   pa   329 
1    542433ry5  2017-01-11 00:00:00.000   sl   331 
1    542433ry5  2017-01-11 00:00:00.000   sa   332 

所以這裏的想法是我想根據PBaseIDOrder所有記錄進行排序,然後securitysymbol然後TradeDate然後根據交易代碼。基於交易代碼的分類應該是這樣的:'li'交易代碼總是在'pa'之前出現,而'sl'交易代碼在'sa'之前出現,之後'in'出現。

例如 假設安全符號'13033w7l1'有3'li'3'pa'交易,那麼在這種情況下'pa'會在'li'根據rownum值決定後出現。

當我運行這個查詢時,所有'pi'和'li'事務都會出現分組,我不想要。

select PortfolioBaseIDOrder,SecuritySymbol,TradeDate,TransactionCode,rownum 
from dbo.abc where SecuritySymbol='542433ry5' or SecuritySymbol='13033w7l1' 
order by PortfolioBaseIDOrder,SecuritySymbol,TradeDate,(case TransactionCode 
                   when 'li' then 1 
                   when 'pa' then 2 
                   when 'sl' then 3 
                   when 'sa' then 4 end),rownum; 
+2

如果你準備含有DML和任何一個http://sqlfiddle.com/#!6選擇你做和編輯你的問題,你冷highten答案的機會,加入連結此小提琴 –

+0

您的查詢似乎會生成您的預期輸出。你的實際產出是多少? –

回答

1

下你想要的接近:

order by PortfolioBaseIDOrder, SecuritySymbol, TradeDate, 
     row_number() over (partition by PortfolioBaseIDOrder, SecuritySymbol, TradeDate, TransactionCode order by rownum), 
     charindex(TransactionCode, 'li,pa,sl,sa') 

它不處理in,但可以分開進行:

order by PortfolioBaseIDOrder, SecuritySymbol, TradeDate, 
     (case when TransactionCode = 'in' then 2 else 1 end), 
     row_number() over (partition by PortfolioBaseIDOrder, SecuritySymbol, TradeDate, TransactionCode order by rownum), 
     charindex(TransactionCode, 'li,pa,sl,sa') 
+0

這正是我需要的,你拯救了我的一天。非常感謝! –

0

你可以實現你的排序要求只需在您的訂單條款中切換caserownum的位置即可。所以,下面的查詢會讓你獲得想要的結果。我使用表StackOverflowTable2作爲表的名稱。你可以用你的表名替換它。

SELECT 
    PBaseIDOrder 
    ,SecuritySymbol 
    ,TradeDate 
    ,TransactionCode 
    ,rownum 
FROM dbo.StackOverflowTable2 sot 
WHERE SecuritySymbol = '542433ry5' 
OR SecuritySymbol = '13033w7l1' 
ORDER BY PBaseIDOrder, SecuritySymbol, TradeDate, rownum, (CASE TransactionCode 
    WHEN 'li' THEN 1 
    WHEN 'pa' THEN 2 
    WHEN 'sl' THEN 3 
    WHEN 'sa' THEN 4 
END); 

當我在SSMS中運行上述查詢時,它給出了以下結果。

SSMS results of above query

相關問題