1
Select * from Table1

输出

Alias(Auto generate no)   ShortName       LongName         IssuerID       TypeName
 1                         ABC           ABC Pvt Ltd.         23            Current
 2                         DEF           DEF Pvt Ltd.         34            Provisional
 3                         GHI           GHI Pvt Ltd.         50            Legacy

我想按行查看

预期产出

Fields        Current           Provisional      Legacy

Alias          1                   2              3
ShortName      ABC                DEF            GHI
LongName       ABC Pvt Ltd.      DEF Pvt Ltd.   GHI Pvt Ltd.
IssuerID       23                 34              50

如何对上述条件进行选择查询?

我努力了:

select *
from Table1
pivot
(
   avg(IssuerID) for TypeName in
   (
      [Fields],[Current],[Provisional],[Legacy]
   )
) as TypeName
4

2 回答 2

1

这种类型的数据转换可以通过同时应用SQL Server 中的UNPIVOT和 then函数来完成。PIVOT

UNPIVOT函数获取您的 columns AliasShortNameLongName并将IssuerID它们转换为行值。但是,为了使UNPIVOT这些值的数据类型起作用,这些值必须相同:

select typename, value, fields
from
(
  select cast(alias as varchar(20)) alias,
    shortname,
    longname,
    cast(issuerid as varchar(20)) issuerid,
    typename
  from Table1
) u
unpivot
(
  value
  for fields in (Alias, ShortName, LongName, IssuerId)
) unpiv

请参阅带有演示的 SQL Fiddle

编辑数据UNPIVOT后,您可以将该PIVOT函数应用于Typename列值:

select fields, [current], [provisional], [legacy]
from
(
  select typename, value, fields
  from
  (
    select cast(alias as varchar(20)) alias,
      shortname,
      longname,
      cast(issuerid as varchar(20)) issuerid,
      typename
    from Table1
  ) u
  unpivot
  (
    value
    for fields in (Alias, ShortName, LongName, IssuerId)
  ) unpiv
) src
pivot
(
  max(value)
  for typename in([current], [provisional], [legacy])
) piv

请参阅带有演示的 SQL Fiddle

查询的结果是:

|    FIELDS |      CURRENT |  PROVISIONAL |       LEGACY |
----------------------------------------------------------
|     alias |            1 |            2 |            3 |
|  issuerid |           23 |           34 |           50 |
|  longname | ABC Pvt Ltd. | DEF Pvt Ltd. | GHI Pvt Ltd. |
| shortname |          ABC |          DEF |          GHI |

如果您无权访问UNPIVOTandPIVOT函数,那么您可以使用UNION ALL查询来复制 the UNPIVOT,然后使用带有 a 的聚合函数CASE来复制 a PIVOT

select fields,
  max(case when typename = 'current' then value end) [current],
  max(case when typename = 'provisional' then value end) provisional,
  max(case when typename = 'legacy' then value end) legacy
from
(
  select typename, cast(alias as varchar(20)) value, 'alias' fields
  from Table1 
  union all
  select typename, shortname value, 'shortname' fields
  from Table1 
  union all
  select typename, longname value, 'longname' fields
  from Table1 
  union all
  select typename, cast(issuerid as varchar(20)) value, 'issuerid' fields
  from Table1 
) src
group by fields

请参阅带有演示的 SQL Fiddle

结果将与两个版本相同。

于 2012-11-20T10:16:15.160 回答
0

您需要的并不简单,对于PIVOT.

这是此类传输的类似问题和可能的解决方案。

首先,如果你检查你想要的输出,你甚至必须“混合”列的类型。因此,为此,您肯定也必须将整数或其他数字列转换或转换为 varchar 类型。(一列只有一种类型)

而对于PIVOT,您只能使用一个聚合。有时想想如何欺骗它简直太麻烦了,有时更简单但更长的解决方案可能会更好。

您可以尝试这样的代码:(这是一个SQL Fiddle 演示来展示它。)

WITH CTE_DATA
AS (
  SELECT  DISTINCT
  CAST([Current].Alias as varchar(64)) AS Alias_Current,
  [Current].ShortName AS ShortName_Current,
  [Current].LongName AS LongName_Current,
  CAST([Current].IssuerID as varchar(64)) AS IssuerID_Current,
  CAST(Provisional.Alias as varchar(64)) AS Alias_Provisional,
  Provisional.ShortName AS ShortName_Provisional,
  Provisional.LongName AS LongName_Provisional,
  CAST(Provisional.IssuerID as varchar(64)) AS IssuerID_Provisional,
  CAST(Legacy.Alias as varchar(64)) AS Alias_Legacy,
  Legacy.ShortName AS ShortName_Legacy,
  Legacy.LongName AS LongName_Legacy,
  CAST(Legacy.IssuerID as varchar(64)) AS IssuerID_Legacy
  FROM 
  (SELECT * FROM Data WHERE TypeName = 'Current') As [Current]
  CROSS JOIN (SELECT * FROM Data WHERE TypeName = 'Provisional') As Provisional
  CROSS JOIN (SELECT * FROM Data WHERE TypeName = 'Legacy') AS Legacy
  )
SELECT 'Alias' AS Fields, Alias_Current AS [Current], 
Alias_Provisional AS Provisional, Alias_Legacy AS Legacy
    FROM CTE_DATA
    UNION ALL
SELECT 'ShortName' AS Fields, ShortName_Current AS [Current], 
ShortName_Provisional AS Provisional, ShortName_Legacy AS Legacy
    FROM CTE_DATA
    UNION ALL
SELECT 'LongName' AS Fields, LongName_Current AS [Current], 
LongName_Provisional AS Provisional, LongName_Legacy AS Legacy
    FROM CTE_DATA
    UNION ALL
SELECT 'IssuerID' AS Fields, IssuerID_Current AS [Current], 
IssuerID_Provisional AS Provisional, IssuerID_Legacy AS Legacy
    FROM CTE_DATA
于 2012-11-20T06:21:35.277 回答