我有一个历史表,我需要在ColumnName,ColumnValue表单中选择此表中的值。我正在使用SQL Server 2008,我不确定是否可以使用PIVOT功能来完成此任务。以下是我需要完成的一个简化示例:
这就是我所拥有的:
表的架构是
CREATE TABLE TABLE1 (ID INT PRIMARY KEY, NAME VARCHAR(50))
“历史”表的架构是
CREATE TABLE TABLE1_HISTORY(
ID INT,
NAME VARCHAR(50),
TYPE VARCHAR(50),
TRANSACTION_ID VARCHAR(50))
以下是TABLE1_HISTORY
中的数据ID NAME TYPE TRANSACTION_ID
1 Joe INSERT a
1 Bill UPDATE b
1 Bill DELETE c
我需要将TABLE1_HISTORY中的数据提取为以下格式:
TransactionId Type ColumnName ColumnValue
a INSERT ID 1
a INSERT NAME Joe
b UPDATE ID 1
b UPDATE NAME Bill
c DELETE ID 1
c DELETE NAME Bill
除了升级到Enterprise Edition并利用内置的更改跟踪功能外,您对完成此任务的建议是什么?
答案 0 :(得分:1)
您可以尝试使用UNION
测试数据
DECLARE @TABLE1_HISTORY TABLE (
ID INT,
NAME VARCHAR(50),
TYPE VARCHAR(50),
TRANSACTION_ID VARCHAR(50))
INSERT INTO @TABLE1_HISTORY
SELECT 1, 'Joe', 'INSERT', 'a'
UNION ALL SELECT 1, 'Bill', 'UPDATE', 'b'
UNION ALL SELECT 1, 'Bill', 'DELETE', 'c'
SQL声明
SELECT [TransactionID] = Transaction_ID
, [Type] = [Type]
, [ColumnName] = 'ID'
, [ColumnValue] = CAST(ID AS VARCHAR(50))
FROM @Table1_History
UNION ALL
SELECT [TransactionID] = Transaction_ID
, [Type] = [Type]
, [ColumnName] = 'NAME'
, [ColumnValue] = [Name]
FROM @Table1_History
ORDER BY TransactionID
, ColumnName
答案 1 :(得分:1)
这可以使用SQL Server中的UNPIVOT
函数完成:
select transaction_id,
type,
ColumnName,
ColumnValue
from
(
select transaction_id,
type,
cast(id as varchar(50)) id,
name
from TABLE1_HISTORY
) src
unpivot
(
ColumnValue
for ColumnName in (ID, Name)
) un