4

Project_type、、列を含むテーブルがあるProject_Noとします。OS_Platformここで私は限られたProject_typesと限られたsを持っていOS_Platformます。Project_typeとの間の行列を生成するデータベースビューが必要ですOS_Platform

 MY_TABLE : 
 Project_Type     Project_No       OS_Platform 
 Drivers          345              Linux
 WebService       453              Windows                    
 Drivers          034              Windows            
 Drivers          953              Solaris
 DesktopApp       840              Windows 
 WebService       882              Solaris   

これで、選択した列がProject_typeあります。OS_Platform異なる行と列名を持つこれら2つの列のマトリックスビューが必要です。

Project_Type     Linux    Windows     Solaris
WebService       null      true         true
Drivers          true      true         true
DesktopApp       null      true         null

可能かどうか誰か教えてもらえますか?そんなことがあるものか ?

4

3 に答える 3

2

使用しているSQL製品でサポートされている場合は、専用のPIVOT機能を使用することもできます。たとえば、SQLServer2005以降では次のように機能します

SELECT *
FROM (
  SELECT DISTINCT
    Project_Type,
    'true' AS flag,
    OS_Platform
  FROM MY_TABLE
) s
PIVOT (
  MAX(flag)
  FOR OS_Platform IN (
    Linux, Windows, Solaris
  )
) p
;

Oracle Databaseは、PIVOTをサポートする別の製品ですが、最初に導入されたバージョンはわかりません。次のように、PIVOTのINリストのすべての列を一重引用符で囲んだ後、Oracleで上記のクエリを実行できます。

... IN (
  'Linux', 'Windows', 'Solaris'
)
...
于 2012-11-30T23:49:42.143 に答える
1

これは基本的に、PIVOTデータの行を列に転置するクエリです。値が必要なため、これを実行する最も簡単な方法true/nullは、集計関数とCASEステートメントを使用することです。

select project_type,
  max(case when os_platform ='Linux' then 'true' else null end) Linux,
  max(case when os_platform ='Windows' then 'true' else null end) Windows,
  max(case when os_platform ='Solaris' then 'true' else null end) Solaris
from yourtable
group by project_type

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| PROJECT_TYPE |  LINUX | WINDOWS | SOLARIS |
---------------------------------------------
|   DesktopApp | (null) |    true |  (null) |
|      Drivers |   true |    true |    true |
|   WebService | (null) |    true |    true |
于 2012-11-30T13:57:58.147 に答える
0

値をピボット/アンピボットして、選択した形式に転置する必要があります。

スタック オーバーフローに関するピボットの Google 検索は次のとおりです。これらのどれでもうまくいきます。 https://www.google.com/search?q=sql+pivot+unpivot+site%3Astackoverflow.com&oq=sql+pivot+unpivot+site%3Astackoverflow.com&aqs=chrome.0.57.9985&sugexp=chrome,mod=8&sourceid= chrome&ie=UTF-8

ここで、2 種類の回答が表示されます。1 つ目は、通常のピボット/アンピボット操作です。これらは、既知のデータセットで非常にうまく機能します (簡単ではありますが、高速ではありません) 。つまり、すべてのプロジェクトの種類とプラットフォームがわかっている場合、これは問題なく機能します。

2 番目のタイプは、動的ピボット、または動的 SQL を使用して作成されたピボットです。これは面倒ですが、フィールドを自由に組み合わせることができます。

幸運を!

于 2012-11-30T13:43:13.677 に答える