Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да завъртите неизвестен брой колони и без агрегат в SQL Server?

Докато отговорът на M.Ali ще ви даде резултата, тъй като използвате SQL Server 2012, бих разменил name и адрес колони малко по-различни, за да получите крайния резултат.

Тъй като използвате SQL Server 2012, можете да използвате CROSS APPLY с VALUES за да развъртите тези множество колони в няколко реда. Но преди да направите това, бих използвал row_number() за да получите общия брой нови колони, които ще имате.

Кодът за „ОТКЛЮЧВАНЕ“ на данните с помощта на CROSS APPLY изглежда така:

изберете d.loanid, col =c.col + cast(seq as varchar(10)), c.valuefrom( изберете loanid, име, адрес, row_number() над (разделяне по loanid ред по loanid) seq от вашата таблица) dcross apply( стойности ('име', име), ('адрес', адрес)) c(col, value); 

Вижте SQL Fiddle с демонстрация. Това ще доведе вашите данни във формат, подобен на:

<предварителен код>| LOANID | COL | СТОЙНОСТ ||--------|----------|----------|| 1 | име1 | Джон || 1 | адрес1 | Ню Йорк || 1 | име2 | Карл || 1 | адрес2 | Ню Йорк || 1 | име3 | Хенри || 1 | адрес3 | Бостън |

Вече имате една колона COL с всичките ви нови имена на колони и свързаните стойности също са в една колона. Новите имена на колони вече имат число в края (1, 2, 3 и т.н.) въз основа на колко общо записа имате на loanid . Сега можете да приложите PIVOT:

изберете loanid, name1, address1, name2, address2, name3, address3from( изберете d.loanid, col =c.col + cast(seq as varchar(10)), c.value от ( изберете loanid, name, address, row_number() over(partition by loanid order by loanid) seq от вашата таблица ) d cross apply (стойности ('name', name), ('address', address) ) c(col, value)) srcpivot( max(стойност) за col в (име1, адрес1, име2, адрес2, име3, адрес3)) piv; 

Вижте SQL Fiddle с демонстрация. И накрая, ако не знаете колко двойки Име и Адрес ще имате, тогава можете да използвате динамичен SQL:

ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10))) от ( изберете row_number() over(partition by loanid order by loanid) seq от вашата таблица ) d cross apply (изберете 'Име', 1 съюз всички изберете 'Address', 2) c (col, so) групирайте по seq, col, така че подредете от seq, така че ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ loanid,' + @cols + ' от ( изберете d.loanid, col =c.col + cast(seq as varchar(10)), c.value от ( изберете loanid, име, адрес, row_number() over(partition by loanid order by loanid) seq от вашата таблица ) d cross apply (стойности (''name'', name), (''address'', address) ) c(col, value) ) x pivot ( max(стойност) за col в (' + @cols + ') ) p 'exec sp_executesql @query; 

Вижте SQL Fiddle с демонстрация. И двете версии дават резултат:

<предварителен код>| LOANID | ИМЕ1 | АДРЕС1 | ИМЕ2 | АДРЕС2 | ИМЕ3 | АДРЕС3 ||--------|--------|----------|--------|--------- -|--------|----------|| 1 | Джон | Ню Йорк | Карл | Ню Йорк | Хенри | Бостън || 2 | Робърт | Чикаго | (нула) | (нула) | (нула) | (нула) || 3 | Джоана | LA | Крис | LA | (нула) | (нула) |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете уникално ограничение за множество колони в SQL Server - SQL Server / TSQL урок, част 96

  2. Грешка в заявката с двусмислено име на колона в SQL

  3. Сравнете два реда и идентифицирайте колони, чиито стойности са различни

  4. Преглед на типовете SQL Join с примери

  5. Как да активирате всички ограничения за проверка в базата данни на SQL Server - SQL Server / TSQL урок, част 88