注:おそらく互換性レベルを変更することができます。互換性レベルをより高い値に変更し、このデータベースに依存している特定のバージョンに属しているリンクされたサーバーなどがない場合は、何にも影響しません。明らかにわからない場合は、触れないでください。
とにかく、これを行う方法はいくつかあります。このメソッドは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を変更する必要もありません。ここで
ご意見ありがとうございます。これはSSRSとgoogleで初めての作業で、表を使用してSSRSの列に列を転置する良いリンクが見つかりました。 https://jl45sql.wordpress.com/2012/06/13/transposing-a-dataset-in-ssrs/ –
3行のTablixはそれよりはるかに簡単です。私はあなたのサンプルデータを使用して簡単な例を行います。 –