2017-06-20 24 views
6

Tôi cần chuyển dữ liệu (cột) sang bên trái nếu cột đầu tiên (cột bên trái) có giá trị 0 và NULL phải được thêm vào cột bên phải. Khi giá trị khác 0 được tìm thấy trong bất kỳ cột nào thì giá trị 0 trong cột sau sẽ vẫn giữ nguyên.MS SQL 2012: Trong cột SQL Shift sang bên trái nếu cột chứa 0

Input Dữ liệu: -

cust_id month1 month2 month3 month4 month5 
c1  100  200  300  400  500 
c2  0  0  50  250  350 
c3  0  0  100  0  0 
c4  100  0  100  0  500 
c5  0  0  0  0  0 

Dự kiến ​​Output Kết quả: -

cust_id month1 month2 month3 month4 month5 
c1  100  200  300  400  500 
c2  50  250  350  NULL NULL 
c3  100  0  0  NULL NULL 
c4  100  0  100  0  500 
c5  NULL NULL NULL NULL NULL 

Một công việc xung quanh tĩnh có thể là:

IF month1=0 and month2=0 and month3=0 and month4=0 and month5=0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,'NULL','NULL','NULL','NULL','NULL' FROM input_table 

IF month1=0 and month2=0 and month3=0 and month4=0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month5,'NULL','NULL','NULL','NULL' FROM input_table 

IF month1=0 and month2=0 and month3=0 and month4 != 0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month4,month5,'NULL','NULL','NULL' FROM input_table 

IF month1=0 and month2=0 and month3 !=0 and month4 != 0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month3,month4,month5,'NULL','NULL' FROM input_table 

IF month1 != 0 and month2 != 0 and month3 !=0 and month4 != 0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month1,month2,month3,month4,month5,'NULL' FROM input_table 

Tôi có thể tìm thấy bên dưới khách hàng tiềm năng trên Stack Overflow, giải thích để dịch chuyển cột sang trái nếu tất cả các cột đều rỗng. Nhưng nó thay thế tất cả các NULL (ngay cả khi NULL là đến sau khi bất kỳ giá trị khác không/không null).

move cells left in sql if left contains null and right contains value

Tôi đang lên kế hoạch để xây dựng một giải pháp năng động có thể xử lý các cột mới khi dữ liệu tháng so với tháng trước được thêm vào.

Cơ sở dữ liệu là: MS SQL Server 2012.

SQLs Nhanh Để Chuẩn bị dữ liệu: -

CREATE TABLE input_table(
     cust_id char(5), 
     month1 int, 
     month2 int, 
     month3 int, 
     month4 int, 
     month5 int 
); 


INSERT INTO input_table VALUES 
('c1',100,200,300,400,500), 
('c2',0,0,50,250,350), 
('c3',0,0,100,0,0), 
('c4',100,0,100,0,500), 
('c5',0,0,0,0,0); 
+1

Bạn đã chuẩn hóa dữ liệu của mình dưới dạng bước sơ bộ cụ thể cho hoạt động này chưa? Nếu dữ liệu của bạn ở dạng cột cho cust_id, month_number và giá trị, chúng sẽ dễ dàng hơn để làm việc. Nếu dữ liệu cơ sở ở dạng không chuẩn hóa mà bạn hiển thị, bạn có thể bình thường hóa chúng chỉ cho thao tác này. –

+0

bạn sẽ làm gì với dữ liệu sau khi bạn nhận được dữ liệu ở định dạng này? và bạn có thể vui lòng định dạng các bảng đó bằng cách sử dụng https://ozh.github.io/ascii-tables/ – scsimon

+0

@scsimon Được định dạng i/p và các bảng o/p được mong đợi ở định dạng có thể đọc được không. Điều này là bắt buộc đối với ML Algo. – XEngineer

Trả lời

1

này nên làm những gì bạn cần (demo)

SELECT i.cust_id, 
     oa.* 
FROM input_table i 
     OUTER APPLY (SELECT pvt.* 
        FROM (SELECT month, 
            col = CONCAT('month', ROW_NUMBER() OVER (ORDER BY idx)) 
          FROM (SELECT month, 
              idx, 
              to_preserve = MAX(IIF(month=0,0,1)) OVER (ORDER BY idx) 
            FROM (VALUES (1, month1), 
                (2, month2), 
                (3, month3), 
                (4, month4), 
                (5, month5)) V(idx, month)) unpvt 
          WHERE to_preserve = 1) t 
          PIVOT (MAX(month) FOR col IN (month1, month2, month3, month4, month5)) pvt 
          ) oa 

Nó unpivots cột đánh giá một hàng tại một thời điểm.

Ví dụ C3 sẽ kết thúc unpivoted để

+---------+-------+-----+-------------+ 
| cust_id | month | idx | to_preserve | 
+---------+-------+-----+-------------+ 
| c3  |  0 | 1 |   0 | 
| c3  |  0 | 2 |   0 | 
| c3  | 100 | 3 |   1 | 
| c3  |  0 | 4 |   1 | 
| c3  |  0 | 5 |   1 | 
+---------+-------+-----+-------------+ 

Khái niệm MAX(IIF(month=0,0,1)) OVER (ORDER BY idx) đảm bảo tất cả các giá trị từ người đầu tiên phi không một trở đi có to_preserve thiết lập để 1.

Sau đó, chọn giá trị với cờ to_preserve và sử dụng ROW_NUMBER để cung cấp giá trị có thể được sử dụng để xoay vòng vào cột mới chính xác.

Các vấn đề liên quan