我想有条件地排序 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 子句中调换 case
和 rownum
的位置即可实现您的排序要求。因此,以下查询将为您提供所需的结果。
我使用 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 中 运行 上述查询时,它给出了以下结果。
我手头的问题是我有一个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 子句中调换 case
和 rownum
的位置即可实现您的排序要求。因此,以下查询将为您提供所需的结果。
我使用 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 中 运行 上述查询时,它给出了以下结果。