Sql 查询以获得每个类别的相同行数+;子类别
以下是我的SQL表结构的外观:Sql 查询以获得每个类别的相同行数+;子类别,sql,sql-server-2008,reporting-services,ssrs-2008,Sql,Sql Server 2008,Reporting Services,Ssrs 2008,以下是我的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,
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)
)
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
我正在写一份SSRS报告,其中类别显示为x轴,子类别显示为y轴,产品显示为数据。每个类别都有自己的子类别,因此我在列组中为每个行组显示子类别
SSRS报告不会为未获取值的行绘制单元格。所以我的报告最后是这样的:
这是我当前查询的样子:
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)
)
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中,因此我希望查询返回5(子类别1的最大产品数量)
具有主类别1的每个子类别的行
对于类别2,它将为每个子类别返回2行,因为子类别2的最大产品数
是否可以在SQL中执行此操作,或者是否有其他方法在SSRS报告中执行此操作
--更新--
这是一个包含ProductName行组的表
这是带有子类别列组的矩阵
这是一个具有产品名称行组的表
好的,这里有一种(迂回的)方法:
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
所以。。。这样做的目的是:
- 获取每个类别/子类别组合的行数
- 获取每个组的最大行数
- 使用数字表为每个表创建
占位符行 类别/子类别组合,其中n
是类别的最大值 从上面n
- 为子类别中的每个产品指定行号
- 左键将我们的类别占位符行连接到我们订购的产品
NULL
行
剩下的就是将其应用于报表数据集;坐下来欣赏已经出现的额外行。您是否能够在Designer模式下提供报告的屏幕截图?只是想了解一下tablix本身所涉及的分组以及所有内容是如何组合在一起的。另外,在您的实际数据中,产品之间是否存在任何关系,例如
Cat1SubCat1Product1
和Cat1SubCat1Product1
——它们位于同一行,但列中的产品是否可以按任何顺序排列,他们和邻近的专栏有什么共同之处吗?@IanPreston:我用设计模式屏幕截图更新了这个问题。不,这两种产品之间没有关系。他们是子类别的孩子。非常感谢。我真的很感谢你花时间和精力把这件事安排在一起。