Как отображать данные для строк в 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
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 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 |
Если у вас нет доступа к 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 с демо
Результат будет одинаковым для обеих версий.
Что вам нужно, это не просто, и это не очень хорошая задача для 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