我想有条件地排序一张桌子

时间:2017-11-11 12:53:16

标签: sql sql-server-2008 sorting sql-order-by

我现在的问题是我有一个表,其数据已经根据一些规则进行了排序(进一步讨论)我必须编写一个实现进一步排序的查询。

样本表:

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'应该出现。

例如 假设对于securitysymbol'13033w7l1'有3'li'3'pa'交易,那么在这种情况下,'pa'将在根据rownum值决定'li'之后出现。

当我运行此查询时,所有'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 个答案:

答案 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')

答案 1 :(得分:0)

只需在您的order by by子句中切换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中运行上述查询时,它给出了以下结果。

https://bowerstudios.com/node/1007

相关问题