在使用计算结果和表别名时,如何创建动态order by子句

时间:2015-07-12 20:33:57

标签: sql-server

我有以下查询,并且当我用[Mach No]替换顺序时使用参数使其成为动态子句时无法使其工作。我已经阅读了几篇关于使用Case以及何时用实际计算替换计算出的名称的帖子,但我觉得问题依赖于使计算起作用所必需的表别名。这是一个自我加入的表。

Select  D1.Gaming_day As [Gaming Day], D1.mach_id AS [Mach No], (D1.grs_coin_in-D2.grs_coin_in)/100 AS [Coin In],
        (D1.grs_drop-D2.grs_drop)/100 as [Drop],
         (D1.grs_cashable_ticket_out_amt-D2.grs_cashable_ticket_out_amt)/100 AS [Vouchers Out],
        (D1.grs_jackpot-d2.grs_jackpot)/100 AS Jackpots,
        (D1.grs_hpay_cashout_receipt_amt/100-D2.grs_hpay_cashout_receipt_amt/100) AS Handpay,
        ((D1.grs_drop-D2.grs_drop) - (D1.grs_cashable_ticket_out_amt-D2.grs_cashable_ticket_out_amt)-(D1.grs_jackpot-d2.grs_jackpot))/100 As [Win],
         Hold_Percentage/100 AS PAR,((D1.grs_coin_in-D2.grs_coin_in)*Hold_Percentage/100)/100 AS [Win at PAR],
        ((D1.grs_bills_in_1-D2.grs_bills_in_1)+(D1.grs_bills_in_2-D2.grs_bills_in_2)*2+(D1.grs_bills_in_5-D2.grs_bills_in_5)*5+(D1.grs_bills_in_10-D2.grs_bills_in_10)*10+(D1.grs_bills_in_20-D2.grs_bills_in_20)*20+(D1.grs_bills_in_50-D2.grs_bills_in_50)*50+(D1.grs_bills_in_100-D2.grs_bills_in_100)*100) AS  Currency,
        (d1.grs_cashable_ticket_in_amt-D2.grs_cashable_ticket_in_amt)/100 AS [Vouchers In] 
from DropMeters AS D1,DropMeters AS D2,MachineInformation 
where D1.gaming_day=(@date1)AND D2.gaming_day=(@date2) AND D1.mach_id=D2.mach_id AND D1.mach_id=MachineInformation.mach_id

Order by [Mach No]

1 个答案:

答案 0 :(得分:1)

如果您想要动态order by,最安全的做法是为每个可能的变量单独case

order by (case when @param = 'col1' then col1 end),
         (case when @param = 'col2', then col2 end),
         . . .

原因很简单。 case表达式返回在编译时定义的具有特定类型的单个值。关于类型转换的各种规则可能会在代码运行时导致不适当的转换或错误。