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

SQL - Xoay nhiều cột mà không có Aggregrates

Một phần của vấn đề là bạn đã hủy chuẩn hóa dữ liệu trên nhiều cột mà bạn muốn xoay. Tốt nhất, bạn nên xem xét việc sửa cấu trúc bảng của mình để bạn dễ dàng bảo trì và truy vấn hơn. Nếu bạn không thể sửa cấu trúc bảng, thì bạn nên bỏ chia các cột trước rồi áp dụng PIVOT để có được kết quả cuối cùng.

Quá trình UNPIVOT sẽ lấy nhiều cột và chuyển chúng thành nhiều hàng. Tùy thuộc vào phiên bản SQL Server của bạn, có một số cách mà bạn có thể thực hiện việc này. Bạn có thể sử dụng hàm UNPIVOT hoặc vì bạn đang sử dụng SQL Server 2008, bạn có thể sử dụng ÁP DỤNG CHÉO với mệnh đề VALUES để bỏ chia.

Mã ÁP DỤNG / VALUES CROSS sẽ là:

select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
  values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)

Xem SQL Fiddle with Demo . Thao tác này lấy nhiều cột của bạn và đặt dữ liệu vào định dạng tương tự như sau:

| PRODUCTTITLE |  COL | VALUE |
-------------------------------
|    Product 1 |  Dec |     0 |
|    Product 1 | Dec# |     0 |
|    Product 1 |  Nov |     0 |
|    Product 1 | Nov# |     0 |
|    Product 1 |  Oct |     0 |
|    Product 1 | Oct# |     0 |
|    Product 1 |  Sep |     0 |
|    Product 1 | Sep# |     0 |

Khi dữ liệu ở định dạng này, bạn có thể áp dụng PIVOT cho các giá trị trong col trong đó có các tên tháng:

select producttitle, jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
  may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
  sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#]
from
(
  select t.producttitle, c.col, c.value
  from tmpData t
  cross apply
  (
    values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
  ) c (col, value)
) d
pivot
(
  sum(value)
  for col in (jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
              may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
              sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#])
) piv;

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

| PRODUCTTITLE | JAN | JAN# |  FEB | FEB# |  MAR | MAR# |  APR | APR# |  MAY | MAY# | JUN | JUN# | JUL | JUL# | AUG | AUG# | SEP | SEP# | OCT | OCT# | NOV | NOV# | DEC | DEC# |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|    Product 1 |   5 |    2 |    5 |    1 |    5 |    4 |    5 |    6 | 4.44 |    9 |   5 |    1 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |
|    Product 2 |   0 |    0 |    0 |    0 |    0 |    0 | 4.33 |    3 | 4.67 |    3 |   5 |    1 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |
|    Product 3 | 4.6 |    5 | 4.75 |    8 | 4.75 |    8 |    4 |    6 |    5 |    6 |   5 |    3 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thuật toán để tránh SQL injection trên MSSQL Server từ mã C #?

  2. Cách cài đặt SQL Server trên SUSE 12

  3. Cách sử dụng bảng đã chèn \ đã xóa trong thủ tục được lưu trữ?

  4. SQL chọn nhiều hàng trong một cột

  5. SQL Server 2016:Tạo người dùng cơ sở dữ liệu