我有以下查询,并且当我用[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]
答案 0 :(得分:1)
如果您想要动态order by
,最安全的做法是为每个可能的变量单独case
:
order by (case when @param = 'col1' then col1 end),
(case when @param = 'col2', then col2 end),
. . .
原因很简单。 case
表达式返回在编译时定义的具有特定类型的单个值。关于类型转换的各种规则可能会在代码运行时导致不适当的转换或错误。