查询我的SSRS报告

时间:2014-10-20 11:30:31

标签: sql sql-server-2008 reporting-services ssrs-2008

我有一个查询,我不希望案例陈述包含在Group By中, 但它没有它们就会出错。 请它。

select res.bu_desc,res.product_desc,sum(partcount) as cnt,report_status from (
  select bu.bu_desc,prod.Product_desc, count(part_no) as partcount, 
   CASE 
     WHEN pd.created_date between '2012-08-01' and '2014-08-01' THEN 'New' 
      WHEN  s.Status_Id>=4 and s.Status_Id<8 THEN 'Backlog' 
        WHEN pd.analysis_complete_date  between '2012-08-01' and '2014-08-01'                      THEN            'Delivered'              
    END as report_status 
    from scn_part_details pd 
   left join scn_project_details prd on prd.project_id=pd.project_id 
left join scn_bu bu on bu.bu_id=prd.bu_id 
 left join SCN_Product_Name prod on prod.product_id=prd.product_id 
   left join [dbo].[SCN_CurrentStatus] as cs on cs.[Part_Id_Num]=pd.[Part_Id_Num] 
   left join [dbo].[SCN_Status] as s on cs.[Part_Status_Id]=s.Status_Id 
     where prd.group_id=1 and s.Status_Id not in (12)
         and pd.created_date between '2012-08-01' and '2014-08-01'
         and pd.analysis_complete_date  between '2012-08-01' and '2014-08-01'
    group by  prod.Product_desc,bu.bu_desc,s.Status_Id,pd.created_date,pd.analysis_complete_date
       having count(part_no) > 5) as res
             group by res.bu_desc,res.product_desc,report_status
                   group by res.bu_desc,res.product_desc,report_status

我只想查询我的ssrs报告,在那里我会得到零件计数,这些零件是由日期,未完成的零件计数以及成功交付的日期和零件计数创建的。

我想以条形图形式显示报告。

状态是新的,Backlog,已交付。并且所有结果都在查询中获得状态NEW,因为第一种情况适用于所有这些。即所有这些都是创造出来的。结果没有进入第二和第二阶段。

如何解决此问题。?

2 个答案:

答案 0 :(得分:0)

为什么需要内部group by?你不能这样做:

select 
  res.bu_desc,
  res.product_desc,
  count(partcount) as cnt,
  report_status 
from (select 
        bu.bu_desc,
        prod.Product_desc, 
        part_no, 
        CASE WHEN pd.created_date between '2012-08-01' and '2014-08-01' THEN 'New' 
             WHEN s.Status_Id>=4 and s.Status_Id<8 THEN 'Backlog' 
             WHEN pd.analysis_complete_date  between '2012-08-01' and '2014-08-01' THEN 'Delivered'              
        END as report_status 
      from scn_part_details pd 
      left join scn_project_details prd on prd.project_id=pd.project_id 
      left join scn_bu bu on bu.bu_id=prd.bu_id 
      left join SCN_Product_Name prod on prod.product_id=prd.product_id 
      left join [dbo].[SCN_CurrentStatus] as cs on cs.[Part_Id_Num]=pd.[Part_Id_Num] 
      left join [dbo].[SCN_Status] as s on cs.[Part_Status_Id]=s.Status_Id 
      where prd.group_id=1 and s.Status_Id not in (12)
      and pd.created_date between '2012-08-01' and '2014-08-01'
      and pd.analysis_complete_date  between '2012-08-01' and '2014-08-01'
     ) as res
  group by 
    res.bu_desc,
    res.product_desc,
    res.report_status

答案 1 :(得分:0)

由于我在评论部分做出的所有假设都令人惊讶地证明是正确的(即使我混淆了项目和产品),我可以说以下内容:

  1. 您将scn_part_details中的每个部分与其项目(scn_project_details)连接在一起。这是每个部分的一条记录。
  2. 您将scn_part_details中的每个部分与其产品(SCN_Product_Name)连接在一起。每部分仍然有一条记录。
  3. 您将scn_part_details中的每个部分与其超级部件状态(SCN_CurrentStatus然后是SCN_Status)连接在一起。每部分仍然有一条记录。
  4. 您使用他们的bu(scn_bu)加入每个项目。我们仍然每个部分有一个记录,包括产品,项目,状态和bu。 (好吧,我们打电话给一个主项目,因为一个人有很多项目。)
  5. 您按产品说明进行分组。因此,几乎就像按产品分组一样。人们宁愿按product_id分组。但是,我们假设没有相同描述的产品。
  6. 您按主项目的描述进行分组。同样,这几乎就像bu_id分组一样。再说一次,我们假设bu描述是唯一的。
  7. 话虽如此:有些项目涉及产品零件,您希望查看主项目和产品列表,其中包含每个状态的零件数量。

    但是,您的查询中存在一些问题(除了按说明分组而不是ID):

    • 您希望看到不同的状态,但是您要在where子句中限制查询,以便只获得已交付的状态。
    • 你的案子条款错了;它假设所有创建的部件都是新的。它必须颠倒过来,以便它查找交付的部件,然后查找后退部件,然后查找新部件。
    • 您的左连接不起作用,因为您通过询问prd.group_id = 1而s.Status_Id不在(12)中将它们转换为where子句中的内连接。

    由于您对产品和项目感兴趣,我认为您错误地使用了左连接,而是希望使用内部连接。

    select 
      bu.bu_desc, 
      prod.product_desc, 
      case 
        when pd.analysis_complete_date  between '2012-08-01' and '2014-08-01' then 'delivered'              
        when  s.status_id >= 4 and s.status_id < 8 then 'backlog' 
        else 'new' 
      end as report_status,
      count(*) as partcount
    from scn_part_details pd 
    join scn_project_details prd on prd.project_id = pd.project_id and prd.group_id = 1 
    join scn_bu bu on bu.bu_id = prd.bu_id 
    join scn_product_name prod on prod.product_id = prd.product_id 
    join scn_currentstatus cs on cs.part_id_num = pd.part_id_num
    join scn_status s on cs.part_status_id = s.status_id and s.status_id not in (12)
    where pd.created_date between '2012-08-01' and '2014-08-01'
    group by 
      bu.bu_desc, 
      prod.product_desc, 
      case 
        when pd.analysis_complete_date  between '2012-08-01' and '2014-08-01' then 'delivered'              
        when  s.status_id >= 4 and s.status_id < 8 then 'backlog' 
        else 'new' 
      end;