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

Chọn giá trị cột làm cột bằng PIVOT

Yêu cầu của bạn không hoàn toàn rõ ràng nhưng có vẻ như bạn đang cố tạo một cột mới có tên c sau đó là row_number() được liên kết với nó - c1, c2 c3, etc .

Nếu bạn sử dụng phần sau trong truy vấn con của mình:

SELECT Val1, Val2,
  'C'+ cast(row_number() over(partition by Val2 
                              order by val1) as varchar(10)) col
FROM TEMP1

Xem SQL Fiddle with Demo

Bạn sẽ nhận được kết quả:

| VAL1 |  VAL2 | COL |
----------------------
|  S01 | 00731 |  C1 |
|  S02 | 00731 |  C2 |
|  S03 | 00731 |  C3 |
|  S04 | 00731 |  C4 |
|  S05 | 00731 |  C5 |
|  S06 | 00731 |  C6 |
|  S07 | 00731 |  C7 |
|  S07 | 00731 |  C8 |
|  S08 | 00731 |  C9 |
|  S09 | 00731 | C10 |
|  S04 | 00741 |  C1 |
|  S01 | 00746 |  C1 |
|  S01 | 00770 |  C1 |
|  S01 | 00771 |  C1 |
|  S02 | 00771 |  C2 |

Đây dường như là kết quả mà bạn muốn PIVOT . Sau đó, bạn sẽ áp dụng PIVOT tới cái này bằng cách sử dụng:

SELECT Val2,
   c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
  SELECT Val1, Val2,
    'C'+ cast(row_number() over(partition by Val2 
                                order by val1) as varchar(10)) col
  FROM TEMP1
) src
PIVOT
(
  MAX(Val1)
  FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;

Xem SQL Fiddle with Demo . Kết quả cuối cùng của bạn sau đó là:

|  VAL2 |  C1 |     C2 |     C3 |     C4 |     C5 |     C6 |     C7 |     C8 |     C9 |    C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 |    S02 |    S03 |    S04 |    S05 |    S06 |    S07 |    S07 |    S08 |    S09 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 |    S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |

Lưu ý:kết quả của tôi hơi khác so với kết quả bạn yêu cầu là kết quả mong muốn vì tôi đang thực hiện ORDER BY val1 nguyên nhân gây ra S07 các giá trị được nhóm lại với nhau.

Không có thứ tự dữ liệu nào trong cơ sở dữ liệu trừ khi bạn yêu cầu, vì vậy không có gì đảm bảo rằng một trong các S07 các giá trị sẽ xuất hiện dưới dạng C10 . Bạn có thể sử dụng những điều sau để nhận được kết quả nhưng không có gì đảm bảo rằng kết quả sẽ luôn theo đúng thứ tự:

SELECT Val2,
  c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
  SELECT Val1, Val2,
    'C'+ cast(row_number() over(partition by Val2 
                                order by (select 1)) as varchar(10)) col
  FROM TEMP1
) src
PIVOT
(
  MAX(Val1)
  FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;

Xem SQL Fiddle with Demo . Sử dụng order by (select 1) thay đổi thứ tự của dữ liệu nhưng nó không đảm bảo rằng nó sẽ luôn theo thứ tự đó. Kết quả là:

|  VAL2 |  C1 |     C2 |     C3 |     C4 |     C5 |     C6 |     C7 |     C8 |     C9 |    C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 |    S02 |    S03 |    S04 |    S05 |    S06 |    S07 |    S08 |    S09 |    S07 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 |    S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chi phí cho khoảng không quảng cáo nhập trước - xuất trước (FIFO)

  2. Tạo Cơ sở dữ liệu SQL Server với SQLOPS

  3. Cách tạo bí danh của cơ sở dữ liệu trong SQL Server

  4. SQL Server 2016:Chèn dữ liệu

  5. Tính Hash hoặc Checksum cho một bảng trong SQL Server