2017-06-30 4 views
2

顧客ごとに年ごとに売上データを集計するHANAクエリがあります。SQLまたはHANA - 1つのレポートで各ユニオンステートメントの列を個別に作成する方法

SELECT YEAR(T0."DocDate"), T0."CardName" "Customer", SUM(T0."DocTotal") "Sales Amt" 
FROM ORDR T0 GROUP BY YEAR(T0."DocDate"), T0."CardName" 

それは次のようになります。私は把握しようとしています何

Current query results

は、水平方向に表示される年で要約を取得する方法、です。

Something like this

答えて

1

これは、軸を交換さ結果セットを、旋回の古典的な変異体です。 現在、SAP HANA SQLはPIVOT/UNPIVOTコマンドを提供していません(HANA 2 SP01まで)。つまり、エフェクトを手動でモデル化する必要があります。 SQLで

は、このための一般的なパターンは次のようになります。

with base (SELECT YEAR(T0."DocDate") "Year" 
       , T0."CardName" "Customer" 
       , SUM(T0."DocTotal") "Sales Amt" 
      FROM 
       ORDR T0 
      GROUP BY YEAR(T0."DocDate"), T0."CardName"), 

SELECT "Customer", SUM("2014") as "2014", 0 as SUM("2015") as "2015" 
FROM 
    (SELECT "Customer", "Sales Amt" as "2014", 0 as "2015" 
    FROM base 
    WHERE "Year" = 2014 
    UNION ALL 
    SELECT "Customer", 0 as "2014, "Sales Amt" as "2015" 
    FROM base 
    WHERE "Year" = 2015) 
GROUP BY "Customer"; 

我々は、クエリの最初の部分で共通テーブル式を構築する「ベース」ビューは、年間集計データを作成します。 UNION ALLは、出力テーブル"Customer","2014","2015"および関連する年のフィルタを作成します。他の年は、一定の値0が生成されます。
最後に、この結果セットは、外側のクエリでSUM()集約と結合されます。

明らかに、これはフィルタ条件と列ラベルの両方がクエリでハードコードされているため、非常に静的なアプローチです。これは、データベースの代わりにレポートツールでこの種の変換を行う理由の1つです。このビットよりダイナミックを作るために

1つのオプションは...、出力構造は常に固定とどまるそのように、"Year+1""Year+2"をパラメータとしてフィルタ条件を受け入れ、"Year_base"ような名前の列を返す表関数を作成することです受信アプリケーションでは、「年」列に正しくラベルを付けるだけで済みます。

上記のような同様のアプローチは、グラフィカルな計算ビューでも達成できます。ベーステーブルは、キー数値が制限された複数の投影に供給されます(実際には、どのレコードが集計に使用されるかを決定するフィルタ)。UNIONAGGREGATIONによって統合されます。そのために、オンラインで利用可能な例がたくさんあります。

0

クリスタルレポートでクロス集計を使用します。これは、行を列にピボットする最適なソリューションです。同じクエリを使用し、クロス集計の列フィールドに年を指定します。

関連する問題