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

Cột động - SQL Server - Tháng dưới dạng cột

Dữ liệu của bạn đã được xoay vòng, nhưng cần được xoay vòng ở một cấp độ khác. Tôi nghĩ rằng cách tốt nhất để xử lý vấn đề này là trước tiên hãy bỏ chia sẻ nó, sau đó xử lý đúng trục xoay cấp thứ hai.

Bước 1:Bỏ chia sẻ

Bạn có thể sử dụng SQL 2005 UNPIVOT hoặc sử dụng kỹ thuật CROSS JOIN. Đây là ví dụ của cả hai. Lưu ý rằng tôi đã bỏ qua vài tháng ở giữa để giữ mọi thứ đơn giản. Chỉ cần thêm chúng vào.

-- CROSS JOIN method (also works in SQL 2000)
SELECT
   P.Project,
   Mo =
      DateAdd(mm,
         X.MonthNum,
         DateAdd(yy, P.[Year] - 1900, '19000101')
      ),
   Amount = 
      CASE X.MonthNum
         WHEN 0 THEN Jan
         WHEN 1 THEN Feb
         WHEN 11 THEN Dec
      END
FROM
   ProjectData P
   CROSS JOIN (
      SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 11
   ) X (MonthNum)

Mỗi hàng được lặp lại 12 lần, sau đó câu lệnh CASE chỉ kéo ra một tháng cho mỗi hàng, để dữ liệu không được phân chia độc đáo.

-- UNPIVOT method
SELECT
    P.Project,
    Mo =
       DateAdd(mm,
          Convert(int, P.MonthNum),
          DateAdd(yy, P.[Year] - 1900, '19000101')
       ),
    P.Amount
FROM
   (
      SELECT Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec
      FROM ProjectData
   ) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) P

DROP TABLE ProjectData

Không phải phương pháp nào cũng mang lại hiệu quả rõ ràng mọi lúc. Đôi khi cái này hoạt động tốt hơn cái kia (tùy thuộc vào dữ liệu được xoay vòng). Phương thức UNPIVOT sử dụng một Bộ lọc trong kế hoạch thực thi mà CROSS JOIN không sử dụng.

Bước 2:Xoay lại

Bây giờ, làm thế nào để sử dụng dữ liệu chưa được chia. Bạn đã không nói ai đó của bạn như thế nào sẽ tiêu tốn điều này, nhưng vì bạn sẽ cần đưa dữ liệu vào một tệp đầu ra nào đó, tôi đề xuất sử dụng SSRS (Dịch vụ báo cáo máy chủ Sql), đi kèm với SQL Server 2005 mà không phải trả thêm phí.

Chỉ cần sử dụng Ma trận báo cáo đối tượng để xoay một trong các truy vấn ở trên. Đối tượng này vui vẻ xác định các giá trị dữ liệu để tạo thành các nhãn cột tại thời gian chạy báo cáo và giống như chính xác những gì bạn cần. Nếu bạn thêm một cột định dạng ngày chính xác theo cách bạn muốn, thì bạn có thể sắp xếp theo cột Mo, nhưng sử dụng biểu thức mới làm nhãn cột.

SSRS cũng có nhiều định dạng và các tùy chọn lập lịch có sẵn. Ví dụ:bạn có thể gửi nó qua email một tệp Excel hoặc lưu một trang web để chia sẻ tệp.

Vui lòng cho tôi biết nếu tôi còn bất cứ điều gì.

Đối với bất kỳ ai muốn xem đoạn mã trên hoạt động, đây là một số tập lệnh tạo cho bạn:

USE tempdb

CREATE TABLE ProjectData (
    Project varchar(10),
    [Year] int,
    Jan decimal(15, 2),
    Feb decimal(15, 2),
    Dec decimal(15, 2)
)

SET NOCOUNT ON

INSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)
INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)
INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)
INSERT ProjectData VALUES ('01-11052', 2009, 56131.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. Cách thực thi Thủ tục được lưu trữ từ Laravel

  2. Tham số tên bảng trong .NET / SQL?

  3. tính toán số lượng cổ phiếu đóng cửa, giá cả và giá trị bằng FIFO

  4. Làm thế nào để chuyển đổi kết quả tổng hợp thành cột?

  5. Bảng tổng hợp và các cột nối