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

SQL Server 2008 Вертикални данни към хоризонтални

Можете да използвате функцията PIVOT, за да преобразувате вашите редове с данни в колони.

Вашата оригинална заявка може да се използва за извличане на всички данни, единствената промяна, която бих направил в нея, е да изключа колоната b.field_id защото това ще промени крайното показване на резултата.

Ако имате известен списък с име_на_поле стойности, които искате да превърнете в колони, тогава можете да кодирате заявката си:

изберете app_id, [First Name], [Last Name], [DOB], [Mailing Adr], [Zip]from( SELECT a.app_id, c.field_name, b.field_value FROM table1 a INNER JOIN table2 b ON a.app_id =b.app_id INNER JOIN table3 c ON b.field_id =c.field_id ) dpivot( max(field_value) за field_name в ([First Name], [Last Name], [DOB], [Mailing Adr ], [Zip])) piv; 

Вижте SQL Fiddle с демонстрация.

Но ако ще имате неизвестен брой стойности за field_name , тогава ще трябва да внедрите динамичен SQL, за да получите резултата:

ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(име_на_поле)) от група Table3 по име на поле, идентификатор на поле по идентификатор на поле ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ app_id,' + @cols + ' от ( SELECT a.app_id , c.field_name, b.field_value FROM table1 a INNER JOIN table2 b ON a.app_id =b.app_id INNER JOIN table3 c ON b.field_id =c.field_id ) x опорна точка ( max(field_value) за име на поле в (' + @ cols + ') ) p 'изпълни sp_executesql @query; 

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

<предварителен код>| APP_ID | ПЪРВО ИМЕ | ФАМИЛИЯ | DOB | АДРЕС ЗА ПОЩАНЕ | ZIP |------------------------------------------------ ------------------------| 1234 | Джо | Смит | 15.10.72 | Пощенска кутия 1234 | 12345 || 1239 | Боб | Джонсън | 12/01/78 | 1234 N Star Ave | 12456 |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Минали ли са първичните ключове?

  2. Активиране на поща от база данни в SQL Server (T-SQL)

  3. Има ли значение редът на колоните в клауза WHERE?

  4. Как да актуализирате статистиката на SQL Server за големи таблици

  5. Linux - PHP 7.0 и MSSQL (Microsoft SQL)