内部报告需要复杂的小计

时间:2010-01-13 20:51:21

标签: c# sql linq excel reporting

我需要一个按会员名称 PersonID )返回小计的查询,但突破了2个不同的 ContactTypes 11& ; IsFaceToFace下的12个)。下面的查询为我提供了我需要的基本数据,没有任何小计。

我尝试使用WITH ROLLUPPARTITION BY,但这些对我来说是新的,从来没有完全正确。我相信我需要提供有关表格结构的更多信息,但可能不会。

此外,我的最终目标是在Excel 2007中为我们的内部财务团队提供此功能,因此我对任何解决方案非常开放。无论是SQL,LINQ(虽然它使用2 db的),Reporting Services,Excel Macro,C#等等。我只需要它就可以在这一点上工作。

我最好的选择是什么? 这是当前返回的样本。

ClientFolder MemberName        ContactDate  TimeSpent IsFaceToFace

68933   Collins,Vickie          2010-01-07  0.2    11
68937   Pervin,Jennifer         2010-01-07  0.2    11
68937   Pervin,Jennifer         2010-01-11  0.1    11
68937   Pervin,Jennifer         2010-01-12  0.1    11
69861   Klum,Ronald             2010-01-04  0.3    11
69861   Klum,Ronald             2010-01-04  0.3    11
69861   Klum,Ronald             2010-01-07  0.2    11
69861   Klum,Ronald             2010-01-11  0.2    11
70205   Matamoros,Joellen       2010-01-04  0.5    11
70205   Matamoros,Joellen       2010-01-06  0.8    11
70205   Matamoros,Joellen       2010-01-06  2.4    12
70205   Matamoros,Joellen       2010-01-07  0.7    11
70205   Matamoros,Joellen       2010-01-11  0.2    11
70205   Matamoros,Joellen       2010-01-11  1.0    11
70205   Matamoros,Joellen       2010-01-12  0.3    11



USE MATRIX

SELECT  ClientFolder = (select distinct tblApplicationAssociation.PersonApplicationID from Connect.dbo.tblApplicationAssociation where Connect.dbo.tblApplicationAssociation.ApplicationID = 6 AND Connect.dbo.tblApplicationAssociation.PersonID = MATRIX.dbo.tblCaseNotes.PersonID)
        ,MemberName = (select tblPerson.LastName + ',' + tblPerson.FirstName from Connect.dbo.tblPerson where Connect.dbo.tblPerson.PersonID = MATRIX.dbo.tblCaseNotes.PersonID)
        ,ContactDate
        ,TimeSpent = SUM(TimeSpentUnits)
        ,CASE WHEN ContactTypeID = 3 THEN '12' ELSE '11' END AS IsFaceToFace

FROM tblCaseNotes
        LEFT OUTER JOIN tblCaseNoteContactType
                ON tblCaseNotes.CaseNoteID = tblCaseNoteContactType.CaseNoteID

WHERE InsertUser = 'pschaller' -- this will be a variable for Current User
AND 
ContactDate BETWEEN '01/01/2010' AND '01/31/2010' -- this will be two Date variables

GROUP BY ContactDate, ContactTypeID, PersonID
ORDER BY PersonID, ContactDate, ContactTypeID

2 个答案:

答案 0 :(得分:3)

如果你想把它保存在SQL中,你真的有2个选项,我认为这是最快的方法。您可以使用PARTITION BY,也可以将查询结果插入临时表,然后再次查询它们。所有使用Partition By的确是将所需的SQL语句数从2减少到1并删除临时表。要使用临时表,只需将上述查询的结果插入其中,然后从中执行SELECT并按PersonID和IsFaceToFace进行分组。

答案 1 :(得分:2)

通常情况下,我建议使用直接聚合函数,但是你有一些复杂的连接,我不知道哪些字段属于哪个表。

我就是这样做的。

创建临时表: -

DECLARE @contacts TABLE
(
     ClientFolder int
    ,MemberName   varchar(256)
    ,ContactDate  datetime
    ,TimeSpent    decimal(10,1)
    ,IsFaceToFace int
)


INSERT INTO @contacts
(
     ClientFolder
    ,MemberName
    ,ContactDate
    ,TimeSpent
    ,IsFaceToFace
)
-- Your select statement

然后,

SELECT 
     MemberName
    ,IsFaceToFace
    ,SUM(TimeSpent) AS TimeSpent
    ,MAX(ContactDate) AS ContactDate
FROM
    @contacts
GROUP BY
    MemberName,
    IsFaceToFace

以临时表开销为代价很快,如果需要,可以再次使用该表。

对于报告,您可以使用Microsoft SQL Server Reporting Services(如果可用)。有些版本存在问题,但它确实有一个Excel导出工具,可以很好地输出这种简单。

它还受益于订阅工具,您可以通过邮件或放置在文件共享中来安排将报告的定时运行发送给用户。