我的原始数据返回到SSRS。
IF OBJECT_ID('tempdb..#tmpElections') IS NOT NULL
DROP TABLE #tmpElections
create table #tmpElections
(
ClientId int,
MaterialType varchar(50),
QtyReq int,
QtySent int
)
insert into #tmpElections values (1,'MM1',100,50)
insert into #tmpElections values (2,'MM2',200,50)
insert into #tmpElections values (2,'MM2',200,25)
insert into #tmpElections values (3,'MM3',300,50)
insert into #tmpElections values (3,'MM3',300,150)
insert into #tmpElections values (3,'MM3',300,100)
insert into #tmpElections values (4,'MM4',400,300)
insert into #tmpElections values (4,'MM4',400,100)
select * from #tmpElections
在报告上,状态=部分(如果QtySent 我的ssrs报告应显示如下,合并/空白行单元格,
具有相同的Clientid,materialType和status ='Full'。应显示QtySent列。 Desired Report Sample
什么是最佳方法以及如何获得此结果。
应该在T-SQL还是SSRS上处理。 突出显示的黄色单元格在每个组中的报告上应该为空白。
Sample Report
答案 0 :(得分:1)
我将使用子查询来总计QtySent
以便进行比较,并使用CASE
来分配状态文本值。剩下的只是SSRS格式。
SELECT
e.*
,CASE
WHEN s.TotSent = e.QtyReq THEN 'Full'
ELSE 'Partial'
END AS [Status]
FROM
#tmpElections AS e
LEFT JOIN
(
SELECT
e2.ClientId
,e2.MaterialType
,SUM(e2.QtySent) AS TotSent
FROM
#tmpElections AS e2
GROUP BY
e2.ClientId
,e2.MaterialType
) AS s
ON
s.ClientId = e.ClientId
AND s.MaterialType = e.MaterialType;
结果集:
+----------+--------------+--------+---------+---------+
| ClientId | MaterialType | QtyReq | QtySent | Status |
+----------+--------------+--------+---------+---------+
| 1 | MM1 | 100 | 50 | Partial |
| 2 | MM2 | 200 | 50 | Partial |
| 2 | MM2 | 200 | 25 | Partial |
| 3 | MM3 | 300 | 50 | Full |
| 3 | MM3 | 300 | 150 | Full |
| 3 | MM3 | 300 | 100 | Full |
| 4 | MM4 | 400 | 300 | Full |
| 4 | MM4 | 400 | 100 | Full |
+----------+--------------+--------+---------+---------+
答案 1 :(得分:0)
您快要在那里了。我要做的是添加一个case语句以确定状态:
select ClientId,MaterialType, max(QtyReq) as qtyreq, sum(QtySent) as qtysent
, case when sum(QtySent)<max(QtyReq) then 'Partial' else 'Full' end as [status]
from #tmpElections
group by
ClientId
,MaterialType
然后在报告中..您只需将图像说明中显示的前三列分组...然后将其余列作为详细信息
答案 2 :(得分:0)
谢谢大家的评论和解决方案。我能够按照以下方式解决我的问题。
Create procedure dbo.TestRptSample
as
begin
create table #tmpElections
(
ClientId int,
MaterialType varchar(50),
QtyReq int,
QtySent int,
SentDate datetime
)
insert into #tmpElections values (1,'MM1',100,50,'02/01/2018')
insert into #tmpElections values (2,'MM2',200,50,'02/01/2018')
insert into #tmpElections values (2,'MM2',200,25,'03/01/2018')
insert into #tmpElections values (3,'MM3',300,50,'02/01/2018')
insert into #tmpElections values (3,'MM3',300,150,'02/15/2018')
insert into #tmpElections values (3,'MM3',300,100,'03/01/2018')
insert into #tmpElections values (4,'MM4',400,300,'02/01/2018')
insert into #tmpElections values (4,'MM4',400,100,'03/01/2018')
create table #tmpFinal
(
ClientId int,
MaterialType varchar(50),
QtyReq int,
QtySent int,
SentDate datetime,
mStatus varchar(100),
)
Insert into #tmpFinal
select b.*,a.status
from
(
select ClientId,MaterialType, max(QtyReq) as qtyreq, sum(QtySent) as qtysent
, case when sum(QtySent)<max(QtyReq) then 'Partial' else 'Full' end as [status]
from #tmpElections
group by
ClientId
,MaterialType
) A
inner join #tmpElections B on a.ClientId = b.ClientId and a.MaterialType = b.MaterialType;
with x as
(
select *,
ROW_NUMBER() over (partition by clientId,materialType,qtyReq
order by sentdate) as Rowno
from #tmpFinal
)
select *
,max(rowno) over (partition by clientId,materialType,qtyReq) as MaxRow
from x
order by clientId ,sentdate
end
对row_number使用此过程以按组生成组内的行号。 在报表的行文本框的可见性表达式中,使用以下表达式来显示或隐藏该列。
iif(Fields!mStatus.Value =“ Full” and Fields!Rowno.Value <> Fields!MaxRow.Value,True,False)