我现在的问题是我有一个表,其数据已经根据一些规则进行了排序(进一步讨论)我必须编写一个实现进一步排序的查询。
样本表:
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;
答案 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子句中切换case
和rownum
的位置,即可达到订购要求。因此,以下查询将为您提供所需的结果。
我使用表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中运行上述查询时,它给出了以下结果。