Как отобразить данные по строкам в sql?

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

person Mohan Raj    schedule 20.11.2012    source источник
comment
Что вы пробовали? Вы захотите повернуть данные. Быстрый поиск в Google направит вас в правильном направлении.   -  person Adam Wenger    schedule 20.11.2012
comment
выберите * из сводной таблицы Table1 (avg(IssuerID) для TypeName в ([Fields],[Current],[Provisional],[Legacy])) as TypeName Это не работает!...   -  person Mohan Raj    schedule 20.11.2012
comment
@AdamWenger Хотите показать пример PIVOT, где имена столбцов становятся значениями?   -  person Conrad Frix    schedule 20.11.2012


Ответы (2)


Этот тип преобразования данных можно выполнить, применив обе функции UNPIVOT, а затем PIVOT в SQL Server.

Функция UNPIVOT берет ваши столбцы Alias, ShortName, LongName и 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 с демонстрацией.

После того, как данные были UNPIVOTed, вы можете применить функцию 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 |

Если у вас нет доступа к функциям UNPIVOT и PIVOT, вы можете использовать запрос UNION ALL для репликации UNPIVOT, а затем агрегатную функцию с CASE для репликации 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 с демонстрацией.

Результат будет одинаковым для обеих версий.

person Taryn    schedule 20.11.2012

То, что вам нужно, не простое и не очень хорошая задача для 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
person András Ottó    schedule 20.11.2012