T-SQL - CROSS ПРИМЕНИТЬ К PIVOT?(используя сводную таблицу с табличной функцией)? - PullRequest
3 голосов
/ 29 сентября 2011

У меня есть табличная функция, в основном функция типа split, которая возвращает до 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, вызываемую 12 раз в одном и том же SELECT для одного и того же миллиона строк (где строка данных составляет 500+ байтов).

Насколько я знаю, это потребовало бы сканирования тех же 500 байтов * 1000000 строк, 12 раз.

1 Ответ

4 голосов
/ 16 апреля 2014

Так вы используете кросс-аппликацию.Предположим, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...