[英]How to display data to row wise in 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
可以通过在SQL Server中同时应用UNPIVOT
和PIVOT
函数来完成这种数据转换。
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
数据被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
查询的结果是:
| 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
两个版本的结果将相同。
您需要的并不简单,对于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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.