我有一个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
知道如何设置报告以便正确分组吗?
提前致谢。
答案 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
答案 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, ""))