我想有条件地排序 table

I want to conditionally sort a table

我手头的问题是我有一个table,其中的数据已经根据一些规则排序(进一步讨论)我必须编写一个查询来实现进一步排序。

样本table:

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

我想要的查询输出: 示例 table:

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;

以下接近您的要求:

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

您只需在 order by 子句中调换 caserownum 的位置即可实现您的排序要求。因此,以下查询将为您提供所需的结果。

我使用 table WhosebugTable2 作为 table 的名称。您可以将其替换为您的 table 姓名。

SELECT
     PBaseIDOrder
    ,SecuritySymbol
    ,TradeDate
    ,TransactionCode
    ,rownum
FROM dbo.WhosebugTable2 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 中 运行 上述查询时,它给出了以下结果。