|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
Добрый день. Есть таблица TBLdataIN примерно вот такого вида: FIOBirthDateMaleSalaryAmountИванов Иван Иванович1980-06-01М50000.00Петрова Петра Петровна1995-03-15Ж58000.00Сидоров Сидр Сидорович1985-09-30М52000.00 и некий ID, который прилетает в качестве входного параметра в процедуру, в которой происходит сиё действо, поэтому можно считать его константой, и принять, ну, например, за 999. Необходимо вставить в другую таблицу TBLdataOUT (в некий шлюз) данные из TBLdataIN в следующем виде: ROWIDFIELDNAMEFIELDVALUECONSTFIELD1999FIOИванов Иван Иванович01999BirthDate1980-06-0101999MaleМ01999SalaryAmount50000.0002999FIOПетрова Петра Петровна02999BirthDate1995-03-1502999MaleЖ02999SalaryAmount58000.0003999FIOСидоров Сидр Сидорович03999BirthDate1985-09-3003999MaleМ03999SalaryAmount52000.000 То есть строки в исходной таблице необходимо развернуть по вертикали, причем одним из значений в итоговой таблице является название поля в исходной таблице. Еще пронумеровать по количеству записей в исходной. Что-то тут столько всего, что я немного растерялся, и даже не совсем понимаю с какого боку подступиться к задаче. Направьте, будьте так любезны. Или может плюнуть и просто сделать кучку инсертов по числу полей в исходной таблице? Там получится где-то около 20-30 инсертов. Просто хотелось бы побыстрее, за один заход это сделать. Время доступа к таблице критично. Под спойлером положил код для тестовой исходной таблицы. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:30 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15 см пример с unpivot ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:35 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
RuCosinus, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:45 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
msLex, ну я так и предполагал, что можно с помощью UNPIVOT, даже в тему вынес. Но если честно, никак он мне не дается, по MSDN-овским , да и другим примерам в интеренте, никак не ухвачу суть. invm, точно, спасибо! Я сразу вспомнил, что уже использовал такой вариант, просто настолько редко приходится с этим сталкиваться, что плотно забывается. Еще раз спасибо всем. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:50 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
invm RuCosinus, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Вау! Это можно сделать полностью автоматически! invm , спасибо за пример. Мне бы и в голову не пришло, честно говоря. Я бы руками это сделал: Код: sql 1. 2. 3. 4. 5. 6. 7.
Но, кстати, на паре - тройке миллионов строк решение invm - должно сломаться, т.к. генерируемый на первом шаге xml - вылезет за 2 Гб. Ну и тормозить начнет еще раньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2021, 09:23 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
uaggster Но, кстати, на паре - тройке миллионов строк решение invm - должно сломаться, т.к. генерируемый на первом шаге xml - вылезет за 2 Гб. Ну и тормозить начнет еще раньше. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2021, 11:21 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
invm uaggster Но, кстати, на паре - тройке миллионов строк решение invm - должно сломаться, т.к. генерируемый на первом шаге xml - вылезет за 2 Гб. Ну и тормозить начнет еще раньше. (select t.* for xml raw, type) a(x) cross apply Думаю, вот этот кусок может сломать запрос, если в исходных данных будет отбираться много записей, и размер результирующего xml превысит 2 Гб. Но это - не точно. Наверное, можно было бы обойти этот момент, генерируя этот хмл "построчно", с привязкой к номеру строки, например. Но всё это - не более, чем умозрительно. Сомневаюсь, что ТС собирается таким образом ворочать ~10 миллионные таблицы. Как я уже сказал, оч. круто, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2021, 08:33 |
|
Как написать SELECT как бы транспонированной таблицы (UNPIVOT?)
|
|||
---|---|---|---|
#18+
uaggster Думаю, вот этот кусок может сломать запрос, если в исходных данных будет отбираться много записей, и размер результирующего xml превысит 2 Гб. Так что вряд ли упрется в 2 Гб. Хотя умельцы найдутся всегда :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2021, 10:04 |
|
|
start [/forum/topic.php?fid=46&fpage=22&tid=1684630]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 153ms |
0 / 0 |