sql - 透视表值函数

标签 sql sql-server

我有一个返回两列的 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/

相关文章:

sql - SQL Server 的 LIMIT 和 OFFSET 等效吗?

sql - 使用 SQL 查询的 TreeView

sql - 复杂的 SQL WHERE 子句问题

sql - 如何删除 SQL Server 表列表,忽略约束?

mysql - 自动在另一个表中创建(和删除条目)

sql-server - 要在 SQL Server Data Tools 之外运行 SSIS 包,您必须安装将文件移动到 Integration Services 或更高版本的存档

SQL Server - 异步查询执行

MySQL SELECT 将多个值显示为列

sql - postgresql 中的 Crosstab() 函数导致错误。 (已安装 tablefunc 模块)

sql - 比较两个表之间的数据与单个数据库中的数据