2013-02-26 77 views
6

Tôi có một bảng sql với giá trị hiện tại và giá trị trước đó.Máy chủ SQL chuyển đổi các cột thành hàng

Id Value1 PValue1 Value2 PValue2 
1 A  A  V  V1 
2 B  B1  W  W1 
3 C  C1  X  X 

Tôi muốn so sánh chúng và hiển thị trong bảng sau nếu giá trị thay đổi.

Id Column Value Pvalue 
1 Value2 V  V1 
2 Value1 B  B1 
2 Value2 W  W1 
3 Value1 C  C1 

Có thể trong SQL 2008 mà không lặp lại từng cột không?

Trả lời

10

Bạn có thể sử dụng một CROSS APPLY để UNPIVOT dữ liệu:

SELECT t.id, 
    x.Col, 
    x.Value, 
    x.PValue 
FROM YourTable t 
CROSS APPLY 
(
    VALUES 
     ('Value1', t.Value1, t.PValue1), 
     ('Value2', t.Value2, t.PValue2) 
) x (Col, Value, PValue) 
where x.Value <> x.PValue; 

Xem SQL Fiddle with Demo.

Chỉ vì tôi yêu bằng cách sử dụng trục chức năng, đây là một phiên bản có sử dụng cả UNPIVOTtrục chức năng để có được kết quả:

select id, 
    colname, 
    value, 
    pvalue 
from 
(
    select id, 
    replace(col, 'P', '') colName, 
    substring(col, 1, PatIndex('%[0-9]%', col) -1) new_col, 
    val 
    from yourtable 
    unpivot 
    (
    val 
    for col in (Value1, PValue1, Value2, PValue2) 
) unpiv 
) src 
pivot 
(
    max(val) 
    for new_col in (Value, PValue) 
) piv 
where value <> pvalue 
order by id 

Xem SQL Fiddle with Demo

+0

+1 vì tôi không biết bạn có thể sử dụng CROSS APPLY theo cách đó! –

+0

+1 vì có màu xanh ... err Tôi có nghĩa là cung cấp một câu lệnh SQL. – Kermit

+0

cảm ơn, nó rất hữu ích. – developer

6

Dưới đây là một cách dễ dàng:

SELECT Id, 
     'Value1' [Column], 
     Value1 Value, 
     PValue1 PValue 
FROM YourTable 
WHERE ISNULL(Value1,'') != ISNULL(PValue1,'') 
UNION ALL 
SELECT Id, 
     'Value2' [Column], 
     Value2 Value, 
     PValue2 PValue 
FROM YourTable 
WHERE ISNULL(Value2,'') != ISNULL(PValue2,'') 
+0

+1 - Hãy đánh tôi! – JNK

+0

cảm ơn bạn đã trả lời nhanh. – developer

0

Cách sử dụng công đoàn:

SELECT * FROM 
    (SELECT Id, 'Value1' [Column], Value1 [Value], PValue1 [PValue] 
    FROM table_name 
    UNION ALL 
    SELECT Id, 'Value2' [Column], Value2 [Value], PValue2 [PValue] 
    FROM table_name)tmp 
WHERE Value != PValue 
ORDER BY Id 
0

Cuối cùng, và để hoàn thành, có một lệnh UNPIVOT. Tuy nhiên, vì bạn có hai cột bạn muốn bỏ ghim, có thể sẽ đơn giản hơn khi sử dụng một trong các giải pháp khác.

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