SQL:使用表值函数表

时间:2014-06-03 14:48:00

标签: sql sql-server

我确定有更好的方法可以执行此操作,因为我多次运行相同的表值函数,是否有办法从TVF中获取表格一次,然后针对它运行查询设置我的变量?

DECLARE @RUNS INT
DECLARE @WON INT
DECLARE @PERC FLOAT

SET @RUNS = (SELECT COUNT(*) FROM tvf_horse_going('Allow Me', 'HEAVY'))
SET @WON = (SELECT COUNT(*) FROM tvf_horse_going('Allow Me', 'HEAVY') WHERE PosNum = '1')
SET @PERC = (@WON * 100) / @RUNS

SELECT @RUNS As Runs, @WON As Won, @PERC As Perc

3 个答案:

答案 0 :(得分:1)

SELECT runs
     , won
     , won * 100.0 / runs As perc
FROM   (
        SELECT Count(*) As runs
             , Sum(CASE WHEN PosNum = 1 THEN 1 ELSE 0 END) As won
        FROM   tvf_horse_going('Allow Me', 'HEAVY')
       ) As results

请注意* 100.0。这是避免使用整数数学的快速简便方法。其他[不太懒惰的]方法包括:Cast(won As decimal(5,2)) / Cast(runs As decimal(5,2))或类似的

答案 1 :(得分:1)

select
    @RUNS = count(*),
    @WON = sum(case when PosNum = 1 then 1 else 0 end)
from tvf_horse_going('Allow Me', 'HEAVY')

set @PERC = (@WON * 100) / @RUNS

答案 2 :(得分:1)

您也可以使用哈希表(临时表)。

DECLARE @RUNS INT
DECLARE @WON INT
DECLARE @PERC FLOAT

SELECT * INTO #TEMP FROM tvf_horse_going('Allow Me', 'HEAVY')

SET @RUNS = (SELECT COUNT(*) FROM #TEMP)
SET @WON = (SELECT COUNT(*) FROM #TEMP WHERE PosNum = '1')
SET @PERC = (@WON * 100) / @RUNS

SELECT @RUNS As Runs, @WON As Won, @PERC As Perc
相关问题