0

谢谢你来看我的问题。

我有一个 SQL 分组函数,我想向其中添加参数。(如果可能的话)

我试图将参数,表中的两列拼接到函数中,但我似乎没有做对。

此函数创建一个计算记录的表,我希望能够使用“团队”和“位置”的参数进行过滤。我将如何将此信息添加到数据集以允许我进行过滤?

我通常会使用以下方法添加它们:

select
i.Team
,i.Location
From 
incident i
Where i.Team  in (@Team)
and i.Location in (@Location)

该表称为事件,所有信息都来自同一个表。

我非常感谢这样做的想法。谢谢你。

哦,我正在使用带有 SQL 2008 R2 的 Report Builder 3

declare @st_date datetime;
declare @en_date datetime;
declare @days int;
declare @offset int;
set @en_date = (@en_datein);
set @offset = (@BrowserTimezoneOffset);
set @days = -6;
set @st_date = DATEADD(dd, @days, @en_date);

with daterange(dt) as
(select 
@st_date dt
union all
select 
DATEADD(dd, 1, dt) dt 
from daterange
where dt <= DATEADD(dd, -1, @en_date)
)
select
             left(DATENAME(dw, dt), 3) as weekday
            ,ISNULL(sum(inc.createdc), 0) as createdcount
            ,ISNULL(sum(inr.resolvedclosedc), 0) as resolvedclosedcount
from daterange left outer join
(select
left(DATENAME(dw,DATEADD(mi,@offset,CreatedDateTime)), 3) as createddatetime
,count(recid) as createdc
from Incident
where DATEADD(mi,@offset,CreatedDateTime) >= @st_date
and DATEADD(mi,@offset,CreatedDateTime) <= @en_date
group by  left(DATENAME(dw, DATEADD(mi,@offset,CreatedDateTime)), 3)
) as inc
on inc.CreatedDateTime = left(DATENAME(dw, dt), 3)
left outer join
(select
left(DATENAME(dw, DATEADD(mi,@offset,ResolvedDateTime)), 3) as ResolvedDateTime
,count(case when status in ('Resolved', 'Closed') then 1 end) as resolvedclosedc
from Incident
where DATEADD(mi,@offset,ResolvedDateTime) between @st_date and @en_date
group by  left(DATENAME(dw, DATEADD(mi,@offset,ResolvedDateTime)), 3)
) as inr
on inr.ResolvedDateTime = left(DATENAME(dw, dt), 3)
group by dt
order by dt
4

1 回答 1

0

当使用将使用一个或多个值的参数时,您也可以将它们绑定到数据集。

假设我有假装序列中的订单和人员,但我只想找到某些人的订单。我会遵循几个步骤:

  1. 我将仅为一个参数创建一个数据集并将其称为“人员”,因为此示例让我们使用一个自我执行的表变量并将此“查询”框放置在数据集上。

    declare @People Table ( personID int identity, person varchar(8));
    
    insert into @People values ('Brett'),('Sean'),('Chad'),('Michael')
    ,('Ray'),('Erik'),('Queyn');
    
    select * From @People
    
  2. 我想首先从依赖项开始,这是一个变量@Person 我设置为整数并选中“允许多个值”。然后我在变量的左窗格中选择“可用值”。我选择“从查询中获取值”从 1 中选择我的“人”数据集,选择 PersonID 作为值字段,并选择人作为标签。

  3. 现在我的参数已绑定,我可以继续我的订单集。再次创建一个数据集,但将其称为“OrdersMain”并使用自提取表变量,但我现在添加了一个谓词,该谓词现在也从上面引用我的变量。

    declare @Orders table ( OrderID int identity, PersonID int, Desciption varchar(32), Amount int);
    
    insert into @Orders values (1, 'Shirt', 20),(1, 'Shoes', 50),(2, 'Shirt', 22),
    (2, 'Shoes', 52),(3, 'Shirt', 20),(3, 'Shoes', 50),(3, 'Hat', 20),
    (4, 'Shirt', 20),(5, 'Shirt', 20),(5, 'Pants', 30), (6, 'Shirt', 20),
    (6, 'RunningShoes', 70),(7, 'Shirt', 22),(7, 'Shoes', 40),(7, 'Coat', 80)
    
    Select * from @Orders where PersonID in (@Person)
    
  4. 现在,如果使用 tablix 项目填充我的报告并将“OrdersMain”中的值放入 tablix,则会提示用户使用 Brett、Sean 等标签。但 id 用于订单以限制数据集的范围.

可选的

您可以对另一个数据集中的人的子集重复步骤 1,并将其称为“默认值”。然后随着步骤 2 的扩展,将所有内容保持原样,但将此新数据集添加到从查询中获取的“默认值”中。这样我可以创建一个临时表来获取我最常使用的一些人,然后将它们设置为默认值。这将使报告在调用时自动执行。

过滤也可能意味着 SSRS 中的其他内容。您可以在任何数据集的左侧窗格中看到“过滤器”,您可以应用它。请记住,这将首先评估整个表达式,然后对其进行过滤。恕我直言,这种使用最适合小而快的共享数据集。或者,您也可以在 tablix 元素中使用 filter 子句,当您想要来自同一集合的三个对象但在运行后评估不同的谓词时,这通常很好,但是通过将一个数据集用于多个对象的重用来限制范围。

于 2013-09-26T18:22:06.010 回答