【问题标题】:Rows into Columns by using pivot使用枢轴将行分成列
【发布时间】:2012-11-29 10:14:07
【问题描述】:

你能帮我解决这个错误吗

“nvrchildgender”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。

表结构:

CREATE TABLE [dbo].[tblHRIS_ChildDetails](
    [intCHID] [int],
    [intSID] [int] NOT NULL,
    [nvrChildname] [nvarchar](250) NULL,
    [nvrChildGender] [nvarchar](50) NULL,
    [dttChildDOB] [datetime] NULL,
    [nvrnominee] [nvarchar](50) NULL,
    [nvrChildOccupation] [nvarchar](250) NULL,
    [dttCreatedon] [datetime] NULL,
    [dttModifiedOn] [datetime] NULL,
    [nvrModifiedby] [nvarchar](50) NULL
) ON [PRIMARY]

查询:

select *
from
(
  select value, col+'_'+cast(rn as varchar(10)) col
  from
  (
    select nvrchildname,
      nvrchildgender,
      convert(nvarchar(10), dttchildDOB, 120) dttchildDOB,
      nvrchildoccupation,
      row_number() over(partition by intsid order by intCHID) rn
    from tblHRIS_ChildDetails
    where intsid = 463
  ) src
  unpivot
  (
    value 
    for col in (nvrchildname, nvrchildgender, dttchildDOB,  nvrchildoccupation)
  ) unpiv
) src1
pivot
(
  max(value)
  for col in ([nvrchildname_1], [nvrgender_1], 
              [dttchildDOB_1], [occupation_1], 
              [nvrchildname_2], [nvrgender_2], 
              [dttchildDOB_2], [occupation_2]) 
) piv

我无法运行此查询,我认为请解决一些演员问题。

Sql fiddle

【问题讨论】:

标签: sql sql-server pivot unpivot


【解决方案1】:

要成功 UNPIVOT,列类型必须匹配。由于 4 列中的两列已经是 nvarchar(250),而另外两列更短,因此将它们提升为 nvarchar(250) 是最方便的解决方法。

select *
from
(
  select value, col+'_'+cast(rn as varchar(10)) col
  from
  (
    select nvrchildname,
      cast(nvrchildgender as nvarchar(250)) nvrgender,
      convert(nvarchar(250), dttchildDOB, 120) dttchildDOB,
      nvrchildoccupation occupation,
      row_number() over(partition by intsid order by intCHID) rn
    from tblHRIS_ChildDetails
    where intsid = 463
  ) src
  unpivot
  (
    value 
    for col in (nvrchildname, nvrgender, dttchildDOB, occupation)
  ) unpiv
) src1
pivot
(
  max(value)
  for col in ([nvrchildname_1], [nvrgender_1], 
              [dttchildDOB_1], [occupation_1], 
              [nvrchildname_2], [nvrgender_2], 
              [dttchildDOB_2], [occupation_2]) 
) piv

注意:您已将 PIVOT 列命名为 nvrgender,但基列是 nvrchildgender。同样的问题是,pivot 和 unpivot 之间的 occupation 列命名不匹配。

【讨论】:

  • 嗨,如果你运行这个选择 nvrchildname, cast(nvrchildgender as nvarchar(250)) nvrchildgender, convert(nvarchar(250), dttchildDOB, 120) dttchildDOB, nvrchildoccupation, row_number() over(partition by intsid order by intCHID) rn from tblHRIS_ChildDetails where intsid = 463 你会得到性别和职业,但它不会以表格形式返回
【解决方案2】:

UNPIVOT 列表中的列:

nvrchildname, nvrchildgender, dttchildDOB,  nvrchildoccupation

有不同的数据类型。

您必须确保列的类型。类似的东西:

 ...
  CAST(nvrchildname AS NVARCHAR(10)) nvrchildname,
  CAST(nvrchildgender AS NVARCHAR(10)) nvrchildgender,
  convert(nvarchar(10), dttchildDOB, 120) dttchildDOB,
  CAST (nvrchildoccupation AS NVARCHAR(10)) nvrchildoccupation
 ...

Updated SQL Fiddle Demo

【讨论】:

  • @mahmound where 性别在那里,但它返回 null 检查它
  • 检查性别和儿童职业是否缺失
  • 嗨,如果你运行这个选择 nvrchildname, cast(nvrchildgender as nvarchar(250)) nvrchildgender, convert(nvarchar(250), dttchildDOB, 120) dttchildDOB, nvrchildoccupation, row_number() over(partition by intsid order by intCHID) rn from tblHRIS_ChildDetails where intsid = 463 你会得到性别和职业,但它没有在小提琴中返回你检查了吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多