SSRS:需要分组和总和项目&将子项分成一个记录

时间:2015-04-10 03:20:39

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

我有一个ssrs问题创建一个可以分组的报告&总结类似的项目(我知道在某些方面,要求没有意义,但它是客户想要的)。

我有一张物品表(即产品)。在某些情况下,项目可以是另一个项目的组成部分(称为" Kits")。在这种情况下,我们考虑套件本身,"父项"并且套件中的组件称为"子项"。在我们的Items表中,我们有一个名为" Parent_Item_Id"的字段。子项的记录包含父项的项ID。所以我的数据库样本如下:

ItemId | Parent_Item_Id | Name   | QuantityAvailable
----------------------------------------
1      | NULL           | Kit A  | 10
2      | 1              | Item 1 | 2
3      | 1              | Item 2 | 3
4      | NULL           | Kit B  | 4
5      | 4              | Item 3 | 21
6      | NULL           | Item 4 | 100

项目2& 3是"套件A"的子项目,项目5是"套件B"的子项目。而第6项只是一个独立的项目。

因此,在我的报告中,客户希望看到套件和套件的总和。它的组件在一行中,按父项分组。因此,该报告的一个例子如下:

Name   | Available Qty
--------------------------
Kit A  | 15
Kit B  | 25
Item 4 | 100

知道如何设置报告以便正确分组吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

您可以尝试这种方式来获得套件和套件的总和。它的组成部分。

SELECT A.Name,A.QuantityAvailable+isnull(B.QuantityAvailable,0) AS [Available Qty] 
FROM ItemTable A
LEFT JOIN 
(
    SELECT Parent_Item_Id
    ,SUM(QuantityAvailable) as QuantityAvailable 
    FROM ItemTable
    WHERE Parent_Item_Id IS NOT null
    GROUP BY Parent_Item_Id 
)B
ON A.ItemId=B.Parent_Item_Id
WHERE A.Parent_Item_Id IS NULL

<强>输出

Name    Available Qty
Kit A   15
Kit B   25
Item 4  100

答案 1 :(得分:1)

select name, sum(quantityavailable) as available_qty
  from (select name, quantityavailable
          from tbl
         where parent_item_id is null
        union all
        select y.name, x.quantityavailable
          from tbl x
          join tbl y
            on x.parent_item_id = y.itemid) x
 group by name

小提琴: http://sqlfiddle.com/#!6/36871/3/0

答案 2 :(得分:0)

在数据集中做起来要容易得多。

示例数据:

WITH items
AS (
SELECT
     1 AS ItemId
    ,NULL AS Parent_Item_Id
    ,'Kit A' AS Name
    ,10 AS QuantityAvailable

UNION ALL

SELECT
     2 AS ItemId
    ,1 AS Parent_Item_Id
    ,'Item 1' AS Name
    ,2 AS QuantityAvailable

UNION ALL

SELECT
     3 AS ItemId
    ,1 AS Parent_Item_Id
    ,'Item 2' AS Name
    ,3 AS QuantityAvailable

UNION ALL

SELECT
     4 AS ItemId
    ,NULL AS Parent_Item_Id
    ,'Kit B' AS Name
    ,4 AS QuantityAvailable

UNION ALL

SELECT
     5 AS ItemId
    ,4 AS Parent_Item_Id
    ,'Item 3' AS Name
    ,21 AS QuantityAvailable

UNION ALL

SELECT
     6 AS ItemId
    ,NULL AS Parent_Item_Id
    ,'Item 4' AS Name
    ,100 AS QuantityAvailable
)

查询:

 SELECT
         parent.Name
        ,parent.QuantityAvailable + ISNULL(child.QuantityAvailable, 0) AS [Available Qty]
    FROM items parent
        LEFT JOIN (
                SELECT
                    Parent_Item_Id
                    ,SUM(QuantityAvailable) AS QuantityAvailable
                FROM items
                WHERE Parent_Item_Id IS NOT NULL
                GROUP BY Parent_Item_Id
                ) AS child
            ON parent.ItemId = child.Parent_Item_Id
    WHERE parent.Parent_Item_Id IS NULL

答案 3 :(得分:0)

如果您的查询非常复杂,那么使用Common Table Expression创建结果的临时表格对象呢?然后基于SQL的问题答案就像应用其他答案的子查询技术一样简单。

如果这对您不起作用,我可能会在您的Tablix中创建一个组,其中包含一个类似于此的表达式组:

=iif(isNothing(Parent_Item_Id.Value), ItemId, Parent_Item_ID)

这将父项与其子项组合在一起,您可以在组级别执行Sum()函数。要获取父项的名称,可以使用如下表达式:

=max(iif(isNothing(Parent_Item_Id.Value), Name.Value, ""))