2

これは私のSQLテーブル構造がどのように見えるかです:

CREATE TABLE TempCategory
(
    Id BIGINT,
    Name VARCHAR(100)
)

CREATE TABLE TempSubCategory
(
    Id BIGINT,
    CategoryId BIGINT,
    Name VARCHAR(100)
)

CREATE TABLE TempProduct
(
    Id BIGINT,
    SubCategoryId BIGINT,
    Name VARCHAR(100)
)

http://sqlfiddle.com/#!3/2606fd/4

カテゴリを x 軸、サブカテゴリを y 軸、製品をデータとして表示する SSRS レポートを作成しています。各カテゴリには独自のサブカテゴリがあるため、各行グループの列グループにサブカテゴリを表示しています。

SSRS レポートは、値を取得できない行のセルを描画しません。したがって、私のレポートは次のようになります。

SSR レポート

これは私の現在のクエリがどのように見えるかです:

SELECT  TempCategory.Id, 'MainCategoryId',
        TempCategory.Name 'CategoryName',
        TempSubCategory.id 'SubCategoryId',
        TempSubCategory.Name 'SubCategory',
        TempProduct.Id 'ProductId',
        TempProduct.Name 'ProductName'
          FROM TempCategory
    INNER JOIN TempSubCategory
        ON TempCategory.Id = TempSubCategory.CategoryId
    INNER JOIN TempProduct
        ON TempSubCategory.Id = TempProduct.SubCategoryId

私が探しているのは、サブカテゴリグループごとに常に同じ数の行を返すようにクエリを変更して、データがある行にnullまたは0があるようにすることです。

例: カテゴリ 1 には 3 つのサブカテゴリがあり、製品の最大数はサブカテゴリ 1 にあるため、メインカテゴリ 1 を持つサブカテゴリごとにクエリで 5 (サブカテゴリ 1 の製品の最大数) 行を返すようにします。

カテゴリ 2 の場合、製品の最大数がサブ カテゴリ 2 にあるため、サブ カテゴリごとに 2 行が返されます。

SQLでそれを行うことは可能ですか、それともSSRSレポートでそれを行う他の方法はありますか?

- アップデート -

これは ProductName 行グループを持つテーブルです

テーブル

これは SubCategory 列グループを持つマトリックスです

マトリックス

これは製品名の行グループを持つテーブルです

テーブル

4

1 に答える 1

1

そうです、ここにそれを行う1つの(ラウンドアバウト)方法があります:

with numbers as -- create lazy numbers table; feel free to replace with a proper one
(
  select distinct number
  from master..spt_values
  where number between 1 and 100
)
, rowCounts as
(
  select Category = tc.Name
    , SubCategory = tsc.Name
    , SubCategoryId = tsc.Id
    , MaxSubCatRows = count(1)
  from TempCategory tc
    inner join TempSubCategory tsc on tc.Id = tsc.CategoryId
    inner join TempProduct p on tsc.Id = p.SubCategoryId
  group by tc.Name
    , tsc.Name
    , tsc.Id
)
, maxRowCountPerGroup as
(
  select Category
    , MaxSubCatRows = max(MaxSubCatRows)
  from rowCounts
  group by Category
)
, allCats as
(
  select rc.Category
    , rc.SubCategory
    , rc.SubCategoryId
    , n.number
  from rowCounts rc
    inner join maxRowCountPerGroup mr on rc.Category = mr.Category
    cross apply (select number
                 from numbers
                 where number between 1 and mr.MaxSubCatRows) n
)
, orderedProducts as
(
  select *
    , productRowNumber = row_number() over (partition by SubCategoryId
                                            order by Id)
  from TempProduct
)
select c.Category
  , c.SubCategory
  , Product = p.Name
from allCats c
  left join orderedProducts p on c.subCategoryId = p.subCategoryId
    and c.number = p.productRowNumber
order by c.Category
  , c.SubCategory
  , case when p.Name is null then 1 else 0 end -- nulls last
  , p.Name

demo を使用した SQL Fiddle

だから...これがしていることは次のとおりです。

  • 各カテゴリ/サブカテゴリの組み合わせの行数を取得する
  • グループごとにこれらの行数の最大値を取得します
  • 数値テーブルを使用してn、各カテゴリ/サブカテゴリの組み合わせのプレースホルダー行を作成します。ここnで、上記のカテゴリの最大値です
  • サブカテゴリ内の各製品に行番号を割り当てる
  • カテゴリプレースホルダーの行を注文した製品に左結合します

NULLこれで、SSRS レポートを埋めるために必要な行を含め、必要な数の行が得られました。

あとは、これをレポート データセットに適用するだけです。座って、表示された余分な行を賞賛してください。

于 2013-09-07T00:39:00.693 に答える