SQL - 如何过滤结果作为示例

时间:2017-02-21 02:17:09

标签: sql-server reporting-services

我有一些问题,我希望能够从您那里了解如何做到这一点。

  create table test
     (
      Costumer VARCHAR(10) NOT NULL,
      Order_No VARCHAR(10) NOT NULL,
      Season VARCHAR(10) NOT NULL,
      MinDate datetime NOT NULL,
      Orders  numeric(10) NOT NULL  
     );

   INSERT INTO test 
    (Costumer,Order_No,Season,MInDate,Orders) 
  VALUES 
(444,'1234','161','2016-11-12 20:32:41.210',10),
(444,'4514','161','2016-11-12 20:32:41.210',10),
(444,'2451','161','2017-04-21 20:37:04.827',10),
(555,'3222','161','2016-11-30 20:32:41.210',10),
(555,'2333','161','2016-12-05 20:32:41.210',10),
(555,'4588','161','2017-04-21 20:37:04.827',10),
(666,'4577','161','2016-09-12 20:32:41.210',10),
(666,'4784','161','2016-10-15 20:32:41.210',10),
(888,'4254','161','2016-09-01 20:32:41.210',10),
(888,'2987','161','2016-09-10 20:32:41.210',10),
(888,'2999','161','2017-01-12 20:32:41.210',10),

(321,'1234','162','2016-11-12 20:32:41.210',10),
(321,'4514','162','2016-11-12 20:32:41.210',10),
(321,'2451','162','2017-04-21 20:37:04.827',10),
(565,'3222','162','2016-11-30 20:32:41.210',10),
(565,'2333','162','2016-12-05 20:32:41.210',10),
(565,'4588','162','2017-04-21 20:37:04.827',10),
(777,'4577','162','2016-09-12 20:32:41.210',10),
(777,'4784','162','2016-10-15 20:32:41.210',10),
(111,'4254','162','2016-09-01 20:32:41.210',10),
(111,'2987','162','2016-09-10 20:32:41.210',10),
(111,'2999','162','2017-01-12 20:32:41.210',10) ;

所以我以此表为例。 列是客户,订单号,季节,订单日期,订单号和订单数量。

我想做什么:

基本上我已经有一张表用于SSRS报告。在报告中,我需要添加一个过滤器来显示或不显示从该季节该客户的第一个订单开始45天后的订单。 从上面的示例中,当我打开过滤器时,我需要查看qty的总和,仅用于那个没有从该季节的第一个订单传递45天的订单。

如果第一个客户的过滤器已开启,我需要结果:

客户季节日期总和(数量)

每个客户的输出必须是一行。

例如:

     Filter on:                                 

   444 161 2016-11-12 20:32:41.210  20


   Filter off:

   444 161 2016-11-12 20:32:41.210  30

我尝试了一些代码但是没有为我工作。实际上我需要客户,而不是季节,然后是客户和季节的第一个日期,然后是数量的总和(与45天报告者相关)

我希望你明白这个主意。提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题......这可能会对你有所帮助:

declare @filter bit

if (@filter = 1)
    begin

        declare @temp  table(Costumer VARCHAR(10) NOT NULL,
              Season VARCHAR(10) NOT NULL,
              MinDate datetime NOT NULL)

        insert into @temp 
        select Costumer, Season, min(MinDate)
        from test
        group by Costumer, Season


        select t1.Costumer, t1.Season, min(t.Mindate), sum(t.Orders) as qty 
        from test t 
        inner join @temp t1 on t1.costumer=t.costumer and t1.season = t.season and t1.MinDate=t.MinDate
        where datediff(d, t1.MinDate, getdate())>45
        group by t1.Costumer, t1.Season
    end
else
    begin
        select t.Costumer, t.Season, min(t.Mindate), sum(t.Orders) as qty 
        from test t 
        group by t.Costumer, t.Season
    end