sql unpivot表错误冲突

时间:2018-08-20 12:47:02

标签: sql tsql unpivot

我正在运行下面的固定代码,但它错误     “列“ 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

1 个答案:

答案 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);