2017-11-11 151 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

相关问题