模式计算是从所有数据中提取的,而不是从子集中提取的

时间:2018-11-28 00:10:01

标签: sql sql-server tsql reporting-services

我正在SSRS Report Builder 2016中创建报告。

我有一组数据,其中包含一组代理机构以及每个月向每个代理机构收取的费用金额(总计帐单)。每个代理商可以为TotalBilled设置多个值。我想找到每个代理商的模式TotalBilled值。

我在查询中计算了模式值,但它取自所有代理商中的所有TotalBilled,而不仅仅是与我在参数中设置的代理商相关的TotalBilled。

这是我的数据集:

Select 
 a.AgencyID
 a.startdate,
 a.enddate,
 [TotalBilled],

 (SELECT TOP 1 WITH TIES TotalBilled
    From    invoiceLine I
    WHERE   TotalBilled <> 0
    GROUP BY TotalBilled
    ORDER BY Count(invl.TotalBilled) DESC ) AS ModeTotalBilled

from Agency a
left join invoiceLine invl
     on a.InvoiceID = invl.InvoiceID
where (a.agencyid in (@agency))
and (a.startdate >= @startdate and a.enddate <= @enddate)

我试图在模式查询中加入代理商,但在运行时导致错误

 (SELECT TOP 1 WITH TIES TotalBilled
    From    invoiceLine I
    WHERE   TotalBilled <> 0
    AND     a.InvoiceID = I.InvoiceID
    GROUP BY TotalBilled
    ORDER BY Count(invl.TotalBilled) DESC ) AS ModeTotalBilled

错误:

“无法读取数据集DataSet1的下一个数据行。(rsErrorReadingNextDataRow)

在报表处理期间发生错误。 (rsProcessingAborted)”

什么是更改我的模式值计算的正确方法,以使其受我的代理商参数影响,而不仅仅是从整个数据库中提取?

1 个答案:

答案 0 :(得分:1)

这是您要寻找的吗?

SELECT a.AgencyID, a.startdate, a.enddate,
       (SELECT TOP (1) i.TotalBilled
        FROM invoiceLine i
        WHERE i.TotalBilled <> 0 AND a.InvoiceID = i.InvoiceID
        GROUP BY i.TotalBilled
        ORDER BY COUNT(i.TotalBilled) DESC
       ) as ModeTotalBilled
FROM Agency a
WHERE a.agencyid = @agency AND
      a.startdate >= @startdate AND
      a.enddate <= @enddate;

我不明白您为什么要在外部查询中加入invoice。您应该对所有列名进行限定,尤其是在使用相关子查询时。

TOP (1) WITH TIES在子查询中没有任何意义。如果一个以上的值符合模式,那么所有要做的就是返回错误。