2

Java JDBCを介して接続するHSLQDB ( 2.2.9)データベースを使用しています。

人物Aは予防接種1と3を受け取り、人物Bは2と4を受け取りました。この簡単なクエリを使用すると、次のようになります。

SELECT std.*,vac.Date FROM Students AS std
LEFT JOIN ValuesVaccination AS vac
ON vac.ID_Students = std.ID

次のような結果セットが表示されます。

 ID |  Name    | ID_Vaccination | Date
 1  | PersonA  | 1              | 2011-06-01
 1  | PersonA  | 3              | 2012-03-21
 1  | PersonB  | 2              | 2012-08-11
 2  | PersonB  | 4              | 2012-09-08

私が取得したいのは:

 ID |  Name    | Vaccination1 | Vaccination2 | Vaccination3 | Vaccination4  
 1  | PersonA  |  2011-06-01  |    NULL      |  2012-03-21  |    NULL
 2  | PersonB  |    NULL      |  2012-08-11  |    NULL      |  2012-09-08

これを行う1つの方法は次のとおりです。

SELECT std.*,
       vac1.Date AS "Vaccination1",
       vac2.Date AS "Vaccination2",
       vac3.Date AS "Vaccination3",
       vac4.Date AS "Vaccination4"
FROM Students AS std
LEFT JOIN ValuesVaccination AS vac1
ON vac1.ID_Students = std.ID AND vac1.ID_Vaccinations = 1
LEFT JOIN ValuesVaccination AS vac2
ON vac2.ID_Students = std.ID AND vac2.ID_Vaccinations = 2
LEFT JOIN ValuesVaccination AS vac3
ON vac3.ID_Students = std.ID AND vac3.ID_Vaccinations = 3
LEFT JOIN ValuesVaccination AS vac4
ON vac4.ID_Students = std.ID AND vac4.ID_Vaccinations = 4

問題は、異なる予防接種の数が変動することです。ループを使用してJava文字列のJOINでクエリを作成せずにこれを行うための適切な方法はありますか?

PIVOT関数が必要なものであることがわかりましたが、HSQLDBは​​それをサポートしておらず、stackoverflowとgoogleを検索しても有用な情報が表示されなかったようです。

情報ありがとうございます

4

2 に答える 2

0

PIVOTは標準SQLではなく、 Microsoft SQL Server 2005(およびそれ以降)およびOracle11gでのみサポートされる構文の拡張です。

標準SQLを使用し、すべてのRDBMSで機能するソリューションは次のとおりです。

SELECT s.ID, s.Name, 
    MAX(CASE WHEN ID_Vaccination=1 THEN Date END) AS Vaccination1,
    MAX(CASE WHEN ID_Vaccination=2 THEN Date END) AS Vaccination2,
    MAX(CASE WHEN ID_Vaccination=3 THEN Date END) AS Vaccination3,
    MAX(CASE WHEN ID_Vaccination=4 THEN Date END) AS Vaccination4
FROM Students AS s
LEFT JOIN ValuesVaccination AS v
  ON s.ID = v.ID_Students
GROUP BY s.ID, s.Name;

コメントを再確認してください。

SQLでは、データ値が同じクエリで動的に新しい列を生成することはできません。したがって ピボットクエリでは、クエリを準備する前に、出力に表示する個別のワクチン接種の数を知っている必要があります。

2つのクエリを実行できます。1つは、個別のワクチン接種値のセットを「発見」するためのものです。

SELECT DISTINCT ID_Vaccination FROM ValuesVaccination;

次に、それをアプリケーションにフェッチしてループし、列式を追加して、ピボットクエリを作成します。

唯一の代替手段は、最初のクエリのように、Studentに結合されたすべてのデータをフェッチし、アプリケーションコードを使用してピボット形式に後処理することです。

いずれにせよ、動的ピボットクエリを生成するには、クエリを準備する前、または結果をフェッチした後に、アプリケーションコードで補足する必要があります。

于 2013-01-09T00:52:51.327 に答える
0

END)ビルの答えの後にブラケットが1つだけありすぎています。元の質問のエイリアス名と列名を使用して、このスレッドで100%正解するには:

SELECT std.ID, std.Name, 
    MAX(CASE WHEN v.ID_Vaccinations=1 THEN Date END) AS Vaccination1,
    MAX(CASE WHEN v.ID_Vaccinations=2 THEN Date END) AS Vaccination2,
    MAX(CASE WHEN v.ID_Vaccinations=3 THEN Date END) AS Vaccination3,
    MAX(CASE WHEN v.ID_Vaccinations=4 THEN Date END) AS Vaccination4
FROM Students AS std
LEFT JOIN ValuesVaccination AS v
ON std.ID = v.ID_Students
GROUP BY std.ID, std.Name

目的の結果を返します。

于 2013-01-09T18:42:20.100 に答える