2012-11-20 54 views
1
Select * from Table1 

輸出如何在sql中顯示行數據?

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

你試過了什麼?你會想要將數據轉移。快速的Google搜索會使您朝正確的方向發展。 –

+0

select * from Table1 pivot(avg(IssuerID)for TypeName in([Fields],[Current],[Provisional],[Legacy]))TypeName這不起作用!... –

+2

@AdamWenger小心示範的列名稱成爲價值的PIVOT? –

回答

0

你需要什麼,是不是簡單,它不是一個PIVOT好任務。

Here is a similiar question以及這些傳輸的可能解決方案。首先,如果你檢查你想要的輸出,你甚至不得不「混合」列的類型。所以對於這個,肯定你必須將整數或其他數字列轉換或轉換爲varchar類型。 (一列只有一種類型)

而對於PIVOT,您只能使用一個聚合。 有時候很簡單,要想想如何欺騙它,有時候更簡單但更長的解決方案可以更好地工作。

你可以嘗試這樣的代碼:(這裏是一個SQL Fiddle demo表現出來。)

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 
1

這種類型的數據轉換可以在SQL Server應用兩個UNPIVOT,然後PIVOT函數來完成。

UNPIVOT功能需要你列AliasShortNameLongNameIssuerID並將它們轉換到行值。然而,爲了使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 with Demo

一旦數據已經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 with Demo

查詢的結果是:

| 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 | 

如果您沒有訪問UNPIVOTPIVOT功能,那麼你可以使用一個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 with Demo

結果將是這兩個版本是相同的。