【问题标题】:Query for my SSRS Reports查询我的 SSRS 报告
【发布时间】:2014-10-20 11:30:31
【问题描述】:

我有一个查询,我不希望将 case 语句包含在 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 报告,我将在其中获取按日期创建的零件计数、未完成的零件计数以及成功交付的日期和零件计数。

p>

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

状态是新的、积压的、已交付的。并且所有结果都在此处的查询中获得状态 NEW,因为第一种情况适用于所有结果。即所有这些都是创建的。没有任何结果进入第二和第二阶段。

如何解决?

【问题讨论】:

  • 你真正想要什么?我不明白你在问什么。乍一看:您只使用伪外连接,因为使用 prd.group_id=1 and s.Status_Id not in (12) 您删除了所有外连接记录,只保留了内连接记录。 part_no 属于哪个表?
  • 我只想查询我的 ssrs 报告,我将在其中获取按日期创建的零件计数,未完成的零件计数按日期和零件计数成功交付。状态是新的、积压的、已交付的。并且所有结果都在此处的查询中获得状态 NEW,因为第一种情况适用于所有结果。即所有这些都是创建的。没有任何结果进入第二和第二阶段。如何解决这个问题。?
  • 你在问:它们是被创造出来的吗?如果不是:他们是否积压?如果没有:它们完成了吗?但你想:他们完成了吗?如果不是:他们是否积压?否则:它们是新的。所以只要把你的 WHEN 子句转过来。
  • 再说一遍:part_no 属于哪个表?
  • part_no 属于 scn_part_details 表。

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


【解决方案1】:

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

  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。 (好吧,我们称 bu 为 master project,因为一个 bu 有很多项目。)
  5. 您按产品描述分组。所以这几乎类似于按产品分组。人们宁愿按product_id 分组。但是,我们假设没有具有相同描述的产品。
  6. 您按主项目的描述分组。同样,这几乎类似于按 bu_id 分组。同样,让我们​​假设 bu 描述是唯一的。

话虽如此:有些项目正在处理产品部件,您希望查看主项目和产品列表以及每个状态的部件数量。

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

  • 您希望查看不同的状态,但您在 where 子句中限制了查询,以便您只能获得已交付的状态。
  • 你的case条款是错误的;它假定所有创建的部件都是新的。必须将其倒置,以便查找已交付的零件,然后查找回锁零件,然后查找新零件。
  • 您的左连接不起作用,因为您在 where 子句中通过询问 prd.group_id=1 和 s.Status_Id not in (12) 将它们变成了内连接。

由于您对产品和项目感兴趣,我假设您错误地使用了左连接,而想要使用内连接。

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;

【讨论】:

  • 这个查询看起来不错。但我想再添加一个约束,比如 partcount 应该大于 5,只有这样我才需要显示结果。我可以在哪里添加它。?
  • partcount 是一个聚合(准确地说是 COUNT(*))。如果要限制聚合值,则必须在 GROUP BY 子句后使用 HAVING:GROUP BY bu.bu_desc, prod.product_desc, case ... end HAVING count(*) &gt; 5;
【解决方案2】:

为什么需要内部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

【讨论】:

  • 感谢您的回复。这是我的实际要求。我只想查询我的 ssrs 报告,我将在其中获取按日期创建的零件计数、未完成的零件计数以及成功交付的日期和零件计数。状态是新的、积压的、已交付的。并且所有结果都在此处的查询中获得状态 NEW,因为第一种情况适用于所有结果。即所有这些都是创建的。没有任何结果进入第二和第二阶段。如何解决这个问题。?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多