我正在运行下面的固定代码,但它错误 “列“ TransDate”的类型与UNPIVOT列表中指定的其他列的类型冲突“有人可以建议我需要转换什么吗?我似乎不喜欢datetime列的转换。表中的其他所有内容都是nvarchar。
select DataLoadSysId, DataLoadBatchSysId, Rowid, ColumnName, ColumnValue As ColumnValue
from (
select ExtractSource, RecordTypeNo, RecordLevel1Code, RecordLevel2Code, TransDate,
MainAccount, Amount, PeriodCode, DataAreaId, SourceFile, DataLoadBatchSysId, LoadDate, ValidationErrors, DataLoadSysId, RowId
from [Staging].[FactFinancialsCoded_Abbas_InitialValidationTest]
) x
UNPIVOT
(
ColumnValue
FOR ColumnName
IN ([ExtractSource], [RecordTypeNo], [RecordLevel1Code], [RecordLevel2Code], [TransDate], [MainAccount], [Amount], [PeriodCode], [DataAreaId])
)
As UnpivotExample
答案 0 :(得分:1)
我不喜欢unpivot
关键字。我发现仅使用apply
会更容易:
select ivt.DataLoadSysId, ivt.DataLoadBatchSysId, ivt.Rowid,
v.ColumnName, v.ColumnValue
from [Staging].[FactFinancialsCoded_Abbas_InitialValidationTest] ivt CROSS APPLY
(VALUES ('ExtractSource', ExtractSource),
('RecordTypeNo', RecordTypeNo),
('RecordLevel1Code', RecordLevel1Code),
('RecordLevel2Code', RecordLevel2Code),
('TransDate', TransDate),
('MainAccount', MainAccount),
('Amount', Amount),
('PeriodCode', PeriodCode),
('DataAreaId', DataAreaId)
) v(columname, columnvalue);
这不能解决问题。我之所以喜欢这样做,是因为apply
非常强大,并且不可透视是一种方便的应用程序,用于学习语法(从技术上实现“横向连接”)。
您的问题是竞争类型。您需要将所有内容都转换为字符串。我只能猜测一些非字符串值,但是类似:
select ivt.DataLoadSysId, ivt.DataLoadBatchSysId, ivt.Rowid,
v.ColumnName, v.ColumnValue
from [Staging].[FactFinancialsCoded_Abbas_InitialValidationTest] ivt CROSS APPLY
(VALUES ('ExtractSource', ExtractSource),
('RecordTypeNo', RecordTypeNo),
('RecordLevel1Code', RecordLevel1Code),
('RecordLevel2Code', RecordLevel2Code),
('TransDate', convert(varchar(255), TransDate)),
('MainAccount', MainAccount),
('Amount', convert(varchar(255), Amount)),
('PeriodCode', PeriodCode),
('DataAreaId', DataAreaId)
) v(columname, columnvalue);