我对srs有一个疑问。 如何使用SQL Server数据库表在带有表报表的ssrs中的单个参数中创建父层次结构。 表格:详细信息:
CREATE TABLE [dbo].[empdetails](
[empid] [int] NULL,
[country] [varchar](50) NULL,
[state] [varchar](50) NULL,
[empname] [varchar](50) NULL,
[deptno] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (1, N'india', N'ap', N'abc', 10)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (2, N'india', N'ka', N'def', 20)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (3, N'india', N'tn', N'de', 30)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (4, N'usa', N'TX', N'deet', 50)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (5, N'usa', N'NJ', N'ion', 60)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (6, N'usa', N'WV', N'xy', 70)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (7, N'uk', N'Belfast', N'io', 40)
GO
INSERT [dbo].[empdetails] ([empid], [country], [state], [empname], [deptno]) VALUES (8, N'uk', N'Wycombe', N'un', 50)
GO
基于上表:我想像下面的ssrs表报告中那样在singe paramerte中创建父层级: 国家....>州:下拉菜单如下:
paramername:countryandstateparamer:
india
ap
ka
tn
usa
nj
wv
tx
uk
Belfast
Wycombe
在这里,如果我选择印度,则显示相应的州数据(ap,ka,tn)。 如果我选择ap state然后仅显示ap相关数据(ap) 如果我选择ap和ka状态,则仅显示ap和ka数据(ap和ka) 类似于其他国家和州。
我尝试如下: 数据集:从*中选择*,其中国家在@country中,国家在(@state)
数据集1:从详细信息中选择不同的国家 数据集2:从详细信息中选择不同的州,其中County = @ country
之后,我将进行两个参数映射
在预览时,我得到了两个参数,一个是国家参数,第二个是州参数。但是我只想使用sql server表数据创建一个像counryandstate hierchar一样显示的参数。
请告诉我如何解决ssrs在单个参数中报告多个层次的问题。
答案 0 :(得分:0)
没有内置方法可以将SQL Server作为源来构建层次结构(不过SSAS支持此功能)。
我们可以使用一些代码来完成,第一部分可以使用视图来完成,但是即使看起来好像很多代码,它也应该可以正常工作,而且大多数代码都是重复的(因此为什么视图会更好)
无论如何, 首先,我们需要一个数据集来将数据提供给参数列表。
第一个数据集
创建一个名为dsRegions
的数据集
将数据集查询设置为
/* This could be built as a view to simplfy things */
-- create a table for the results
DECLARE @regions TABLE(RegionDisplayName varchar(50), RegionType varchar(1), RegionOrder decimal (10,3), RegionName varchar(50))
-- first get the countries in order and assign a sort order
INSERT INTO @regions
SELECT *
, ROW_NUMBER() OVER(ORDER BY country) AS CountryOrder
, country
FROM
(SELECT DISTINCT Country, 'C' AS RegionType FROM empdetails) e
-- now get the states and assign the sort order from the country plus a sort oder for the state (supports 999 states/country)
INSERT INTO @regions
SELECT
' ' + state, 'S' -- indent the states so they look better in the parameter list
, RegionOrder + CAST(ROW_NUMBER() OVER(PARTITION BY c.RegionName ORDER BY state) as decimal(10,3)) / 1000 AS StateOrder
, state
FROM @regions c
JOIN empdetails e on c.RegionName = e.country
-- finally output the results
SELECT * FROM @regions order by regionorder
参数:我们称其为@pRegion
因此,创建一个名为pRegion
的参数并将其可用值数据集设置为dsRegions
。
重要:将“值”设置为RegionName
,将标签设置为RegionDisplayName
这将为我们提供一个漂亮的有序缩进列表供用户查看。
主要数据集查询 主要数据集查询会重复大多数参数数据集查询
唯一的区别是最终输出将同时过滤国家和州,并且如果匹配则将返回记录。查询如下
-- create a table for the results
DECLARE @regions TABLE(RegionDisplayName varchar(50), RegionType varchar(1), RegionOrder decimal (10,3), RegionName varchar(50))
-- first get the countries in order and assign a sort order
INSERT INTO @regions
SELECT *
, ROW_NUMBER() OVER(ORDER BY country) AS CountryOrder
, country
FROM
(SELECT DISTINCT Country, 'C' AS RegionType FROM empdetails) e
-- now get the states and assign the sort order from the country plus a sort oder for the state (supports 999 states/country)
INSERT INTO @regions
SELECT
' ' + state, 'S' -- indent the states so they look better in the parameter list
, RegionOrder + CAST(ROW_NUMBER() OVER(PARTITION BY c.RegionName ORDER BY state) as decimal(10,3)) / 1000 AS StateOrder
, state
FROM @regions c
JOIN empdetails e on c.RegionName = e.country
-- output
SELECT
e.*
FROM empdetails e
WHERE country in (@pRegion)
or state in (@pRegion)
我已经完成了一个简单的测试,并且可以正常运行,因此,如果您选择UK和TX,您将获得Belfast,Wycombe和TX的记录
希望这会有所帮助。