【问题标题】:T-SQL - CROSS APPLY to a PIVOT? (using pivot with a table-valued function)?T-SQL - 交叉应用到 PIVOT? (使用带有表值函数的数据透视表)?
【发布时间】:2011-11-27 19:31:52
【问题描述】:

我有一个表值函数,基本上是一个拆分类型的函数,每个数据字符串最多返回 4 行。

所以我跑了:

select * from dbo.split('a','1,a15,b20,c40;2,a25,d30;3,e50')

我明白了:

Seq  Data
1    15
2    25

但是,我的最终数据需要看起来像

15 25

所以我做了一个支点。

select [1],[2],[3],[4] 
from dbo.split('a','1,a15,b20,c40;2,a25,d30;3,e50')
pivot (max(data) for seq in ([1],[2],[3],[4])) 
as pivottable

按预期工作:

1    2
---  ---
15   25

但是,这对一排来说很棒。我现在需要同时处理数百条记录。我的想法是做一个 CROSS APPLY,但不知道如何结合一个 CROSS APPLY 和一个 PIVOT。

(是的,显然简单的答案是编写一个返回 4 列的修改版本,但由于其他原因,这不是一个很好的选择)

非常感谢任何帮助。

我这样做的原因是:当前查询用作 SPLIT 的标量值版本,在同一 SELECT 中针对相同的百万行(其中数据字符串为 500+ 字节)调用 12 次。

据我所知,这需要它扫描相同的 500 字节 * 1000000 行,12 次。

【问题讨论】:

  • 我这样做的原因是:由于 dbo.SPLIT 中的逻辑量很大(上面是一个非常简单的方法),我试图避免运行标量值函数版本SPLIT,看起来像 select dbo.split('a',1,'1,a15,b20,c40;2,a25,d30;3,e50'),最后被调用了 12 次 ("'a',1", "'a',2","'a',3","'a',4"," 'c',1","'c'2",...),.当针对具有一百万行的表进行查询时,这肯定是一件坏事。
  • 我想我不明白什么...无论如何你都需要用新参数调用函数,所以 CROSS APPLY 对你没有帮助。首先如何将参数传递给函数?你能概括一下所涉及的过程吗?
  • 我不想使用参数,而是想从表中提供一个字段。当前进程基本上看起来像select a,b,dbo.splitscalar('a',1,stringofdata), dbo.splitscalar('a', 2, stringofdata), dbo.splitscalar('b',1,stringofdata)...(总共12次),并且由于字符串是几百字节,我认为更改为CROSS APPLY并调用该函数3次可能会更快。
  • 虽然这不能直接回答您的问题,但我使用this SO post 为数据透视表动态创建列。也许会有所帮助。

标签: tsql sql-server-2008 pivot user-defined-functions


【解决方案1】:

这就是您使用交叉应用的方式。假设table1 是您的表,Line 是您要拆分的表中的字段

SELECT * fROM table1 as a
    cross apply dbo.split(a.Line) as b  
    pivot (max(data) for seq in ([1],[2],[3],[4]))  as p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多