Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server:Xoay vòng với tên cột tùy chỉnh

Có một số cách mà bạn có thể làm điều này.

Nếu bạn đã biết một số câu hỏi / câu trả lời thì bạn có thể sử dụng row_number() cùng với một hàm tổng hợp và một biểu thức CASE:

select id,
  max(case when rn = 1 then question end) question1,
  max(case when rn = 1 then answer end) answer1,
  max(case when rn = 2 then question end) question2,
  max(case when rn = 2 then answer end) answer2,
  max(case when rn = 3 then question end) question3,
  max(case when rn = 3 then answer end) answer3
from
(
  select id, question, answer,
    row_number() over(partition by id order by id, question) rn
  from yt
) src
group by id;

Xem SQL Fiddle with Demo

Một gợi ý khác là sử dụng cả hàm UNPIVOT và PIVOT để lấy kết quả. UNPIVOT sẽ trả lời question của bạn và answer và chuyển đổi chúng thành nhiều hàng.

Cú pháp cơ bản cho UNPIVOT sẽ là:

select id,
  col+cast(rn as varchar(10)) col,
  value
from
(
  -- when you perform an unpivot the datatypes have to be the same. 
  -- you might have to cast the datatypes in this query
  select id, question, cast(answer as varchar(500)) answer,
    row_number() over(partition by id order by id, question) rn
  from yt
) src
unpivot
(
  value
  for col in (question, answer)
) unpiv;

Xem Demo . Điều này cho kết quả:

|      ID |       COL |                                VALUE |
--------------------------------------------------------------
| 4482515 | question1 | I would like to be informed by mail. |
| 4482515 |   answer1 |                                   No |
| 4482515 | question2 |                    Plan to Purchase? |
| 4482515 |   answer2 |                       Over 12 months |
| 4482515 | question3 |                   Test Question Text |
| 4482515 |   answer3 |                          some Answer |

Như bạn có thể thấy, tôi đã thêm một row_number() giá trị của truy vấn con ban đầu để bạn có thể liên kết từng câu trả lời cho câu hỏi. Khi điều này đã được bỏ phân chia, thì bạn có thể xoay vòng kết quả trên các tên cột mới bằng question / answer với giá trị số hàng được nối. Mã có cú pháp PIVOT sẽ là:

select id, question1, answer1, question2, answer2,
  question3, answer3
from
(
  select id,
    col+cast(rn as varchar(10)) col,
    value
  from
  (
  -- when you perform an unpivot the datatypes have to be the same. 
  -- you might have to cast the datatypes in this query
    select id, question, cast(answer as varchar(500)) answer,
      row_number() over(partition by id order by id, question) rn
    from yt
  ) src
  unpivot
  (
    value
    for col in (question, answer)
  ) unpiv
) d
pivot
(
  max(value)
  for col in (question1, answer1, question2, answer2,
              question3, answer3)
) piv;

Xem SQL Fiddle với Demo . Bây giờ trong tình huống của bạn, bạn đã nói rằng bạn sẽ có một số câu hỏi / câu trả lời động. Nếu đúng như vậy, thì bạn sẽ cần sử dụng SQL động để nhận được kết quả:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(c.col+cast(rn as varchar(10))) 
                    from 
                    (
                      select row_number() over(partition by id 
                                               order by id, question) rn
                      from yt
                    ) d
                    cross apply
                    (
                      select 'question' col, 1 sort union all select 'answer', 2
                    ) c
                    group by col, rn, sort
                    order by rn, sort
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + '
              from
              (
                select id,
                  col+cast(rn as varchar(10)) col,
                  value
                from
                (
                 -- when you perform an unpivot the datatypes have to be the same. 
                 -- you might have to cast the datatypes in this query
                  select id, question, cast(answer as varchar(500)) answer,
                    row_number() over(partition by id order by id, question) rn
                  from yt
                ) src
                unpivot
                (
                  value
                  for col in (question, answer)
                ) unpiv
              ) d
              pivot 
              (
                  max(value)
                  for col in (' + @cols + ')
              ) p '

execute(@query);

Xem SQL Fiddle with Demo . Những điều này cho kết quả:

|      ID |                            QUESTION1 | ANSWER1 |         QUESTION2 |        ANSWER2 |          QUESTION3 |     ANSWER3 |
------------------------------------------------------------------------------------------------------------------------------------
| 4482515 | I would like to be informed by mail. |      No | Plan to Purchase? | Over 12 months | Test Question Text | some Answer |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạm dừng sao chép máy chủ SQL

  2. Biểu thức bảng thông thường, tại sao lại có dấu chấm phẩy?

  3. Quyền EXECUTE bị từ chối - 'aspnet_Roles_RoleExists'

  4. Lỗi I / O:SSO Không thành công:Thư viện SSPI gốc không được tải

  5. Làm thế nào để chuyển đổi int sang date trong SQL Server 2008