2017-05-09 8 views
0

すべての列を列に基づいて行に移す必要があるレポートを作成しています。PIVOTなしの列に基づいてすべての列を行に変換する

CREATE TABLE TempTable(
    Company VARCHAR(5), 
    ProcessDate DATETIME, 
    OpExp DECIMAL, 
    Tax DECIMAL, 
    Total DECIMAL); 

INSERT INTO TempTable VALUES 
('Comp1', getdate(), 1000, 100, 1100), 
('Comp1', dateadd(year, -1, getdate()), 2000, 200, 2200), 
('Comp1', dateadd(year, -2, getdate()), 3000, 300, 3300); 

SELECT * FROM TempTable; 

enter image description here

しかし、報告書のために、私はここで

enter image description here

に 'ProcessDate' 年に基づいている2015年、2016年、2017年は動的で列をこのテーブルを転置しなければなりません。

Iは、ピボットと試みたが、それはデータベースが生産に既にあるように、 互換性レベルを変更することは不可能である

Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the SET COMPATIBILITY_LEVEL option of ALTER DATABASE 

をスロー。

Simple way to transpose columns and rows in Sql?

しかし、列のデータ型異なっており、すべての行を持っている必要があり、結果として集計関数を使用することはできませんで提案されているように私は、UNION ALL、CASEてみました。

列を行に変換する方法はありますか?または、RDLCの代わりにSSRSを使用してこのレポートを生成することは可能ですか?

答えて

0

はSSRSは、おそらくそれを行うための最善の方法である唯一の方法です...

私は3社のために9行、3行が含まれるように少しこの例では、あなたのサンプルデータを拡張しました。

新しい空白レポートを作成し、データセットを通常どおり追加します。 次に、レポートにマトリックスコントロールを挿入します。 マトリックスを最初に設定するには、下の図のようにフィールドをドラッグします。私たちはこれを編集しますが、それは私たちにすばやいスタートを与えます。

注:ステップ3は、読んでください「ここProcessDateをドラッグして...」 enter image description here

今、私たちは「そうSTEP3からProcessDateセルを右クリックして、クリックだけで年にプロセス日からchnageする必要があります表現 '。 「グループのプロパティ」を[ProcessDate]列グループを右クリックして選択し、グループのデザイナーペインのレポートのデザインの下

=YEAR(Fields!ProcessDate.Value)

に式を設定し、同じ式にプロパティのグループを設定し=YEAR(Fields!ProcessDate.Value)enter image description here

は今バックレポートのデザインで、(上記のステップ4から)のデータセルを右クリックして、「行を挿入」を実行 - >「インサイドグループ - 以下の」enter image description here

繰り返して第三行を追加するには、このプロセスを。

2つの新しい空白のセルで、フィールドリストドロップダウンをクリックし、それぞれ税金と合計を選択します。

enter image description here

キャプション列を追加したい場合。 [Company]が入っているセルを右クリックし、[Insert Column] - > [Inside Group - Right]を選択し、新しいセルを右クリックして[split cell]を選択すると、3行がアンマージされます。各行にキャプションを入力できます。 デザインは次のようになります。

enter image description here

そして、それは実際にそれだ...

最終的な出力は次のようになります。

enter image description here

0

注:おそらく互換性レベルを変更することができます。互換性レベルをより高い値に変更し、このデータベースに依存している特定のバージョンに属しているリンクされたサーバーなどがない場合は、何にも影響しません。明らかにわからない場合は、触れないでください。

とにかく、これを行う方法はいくつかあります。このメソッドはUNIONを使用していますが、なぜこのメソッドを使用できないと言われているのか分かりませんが、これはサンプルの期待と同じものです。

DECLARE @Temptable TABLE (
    Company VARCHAR(5), 
    ProcessDate DATETIME, 
    OpExp DECIMAL, 
    Tax DECIMAL, 
    Total DECIMAL); 

INSERT INTO @TempTable VALUES 
('Comp1', getdate(), 1000, 100, 1100), 
('Comp1', dateadd(year, -1, getdate()), 2000, 200, 2200), 
('Comp1', dateadd(year, -2, getdate()), 3000, 300, 3300); 

SELECT * FROM @TempTable 

DECLARE @ReportStartYear int = 2017 

SELECT 
    t.Company 
    , 'OpExp' as Val 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear -2 THEN OpExp ELSE 0 END) AS ColA 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear -1 THEN OpExp ELSE 0 END) AS ColB 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear THEN OpExp ELSE 0 END) AS ColC 
    , @ReportStartYear - 2 as ColACaption 
    , @ReportStartYear - 1 as ColBCaption 
    , @ReportStartYear as ColCCaption 
    FROM @Temptable t 
    GROUP BY t.Company 
UNION ALL 
SELECT 
    t.Company 
    , 'Tax' as Val 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear -2 THEN Tax ELSE 0 END) AS ColA 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear -1 THEN Tax ELSE 0 END) AS ColB 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear THEN Tax ELSE 0 END) AS ColC 
    , @ReportStartYear - 2 as ColACaption 
    , @ReportStartYear - 1 as ColBCaption 
    , @ReportStartYear as ColCCaption 
    FROM @Temptable t 
    GROUP BY t.Company 
UNION ALL 
SELECT 
    t.Company 
    , 'Total' as Val 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear -2 THEN Total ELSE 0 END) AS ColA 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear -1 THEN Total ELSE 0 END) AS ColB 
    , SUM(CASE YEAR(t.ProcessDate) WHEN @ReportStartYear THEN Total ELSE 0 END) AS ColC 
    , @ReportStartYear - 2 as ColACaption 
    , @ReportStartYear - 1 as ColBCaption 
    , @ReportStartYear as ColCCaption 
    FROM @Temptable t 
    GROUP BY t.Company 

これはあなたの報告書の中で、次の

Company Val  ColA ColB ColC ColACaption ColBCaption ColCCaption 
Comp1 OpExp 3000 2000 1000 2015  2016  2017 
Comp1 Tax  300  200  100  2015  2016  2017 
Comp1 Total 3300 2200 1100 2015  2016  2017 

を返し、あなたは列名が動的であることを心配する必要はありませんので=FIRST(Fields!ColACaption.Value)などであるためにあなたの列ヘッダーを設定することができます。 このメソッドは、返す列の数がわかっている場合に機能します。

HOWEVERこれはSSRSで簡単に行うことができます。行列を作成し、列グループをProcessDate列のYEARを返す式に設定し、次に各値の種類(OpExp、Tax &合計)の詳細グループ内に行を追加し、必要なものを与える必要がありますまた、SQLを変更する必要もありません。ここで

+0

ご意見ありがとうございます。これはSSRSとgoogleで初めての作業で、表を使用してSSRSの列に列を転置する良いリンクが見つかりました。 https://jl45sql.wordpress.com/2012/06/13/transposing-a-dataset-in-ssrs/ –

+0

3行のTablixはそれよりはるかに簡単です。私はあなたのサンプルデータを使用して簡単な例を行います。 –

関連する問題