我有一个返回两列的 TVF:“度量”(名称)和“分数”,即该度量的数字分数:
dbo.ScoringFunction(param1, param2, ..., paramN)
Measure Score
------- -----
measure1 10
measure2 5
... ...
measureN 15
我正在针对包含其参数的大量行运行此函数:
Name Param1 Param2 ... ParamN
---- ------ ------ ------
Daniel 12 5 6
etc.
我正在尝试找到一种方法来在确定这些分数的参数旁边显示度量及其分数:
Name Param1 Param2 ... ParamN measure1 measure2 ... measureN
---- ------ ------ ------ -------- -------- --------
Daniel 12 5 6 10 5 15
etc.
到目前为止,我已经尝试过使用数据透视表,但这很棘手,因为要进行数据透视的数据包含在 TVF 而不是静态表中。我也尝试过使用 CROSS APPLY,但是一旦我有了数据(度量值和分数),我仍然无法将其转换为格式良好的行。
如果有人有任何想法,他们将不胜感激!
最佳答案
在不改变太多(希望如此)的情况下,我将在函数中进行旋转,然后在 CROSS APPLY 中使用该函数并提取列。所以如果你的函数是这样的:
CREATE FUNCTION dbo.ScoringFunction (<i>parameters</i>)
RETURNS TABLE
RETURN (
SELECT Measure, Score
FROM …
)
然后我会这样重写它:
CREATE FUNCTION dbo.ScoringFunction (<i>parameters</i>)
RETURNS TABLE
RETURN (
<b>WITH originalSelect AS (</b>
SELECT Measure, Score
FROM …
<b>)
SELECT
<i>measure1</i>,
<i>measure2</i>,
…
FROM originalSelect
PIVOT (
MAX(Score) FOR Measure IN (<i>measure1</i>, <i>measure2</i>, …)
) p</b>
)
并像这样在最终查询中使用它:
SELECT
t.Name,
t.<i>param1</i>,
t.<i>param2</i>,
…
x.<i>measure1</i>,
x.<i>measure2</i>,
…
FROM atable t
CROSS APPLY dbo.ScoringFunction (t.<i>param1</i>, t.<i>param2</i>, …) x
关于sql - 透视表值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301005/