内部报告需要复杂的小计

我需要一个通过MemberNamePersonID )返回小计的查询,但爆发到2个不同的ContactTypeIsFaceToFace下的11&12 )。 下面的查询得到我需要的基础数据,没有任何小计。

我试着用WITH ROLLUPPARTITION BY搞乱,但那些对我来说是新的,从来没有完全正确的工作。 我相信我需要提供更多关于表格结构的信息,但也许不是。

另外,我的最终目标是在Excel 2007中为我们内部的财务团队提供这个,所以我对任何解决scheme都非常开放。 无论是SQL,LINQ( 虽然这使用2分贝的 ),报表服务,Excelmacros,C#等,我只是需要它在这一点上工作。

我最好的select是什么? 这是目前返回的样本。

 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 

通常,我会build议一个直接的聚集函数,但是你有一些复杂的连接,我不知道哪个字段属于哪个表。

这是我该怎么做的。

创build一个临时表: –

 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导出设施,应该是罚款输出这种简单性。

它还可以从订阅工具中获益,从而您可以安排定期运行的报告交付给用户,通过邮件或放置在文件共享中。

如果你想保留在SQL中,你真的有两个select,我认为这是最快的方法。 您可以使用PARTITION BY,也可以将查询结果插入临时表中,然后再次查询它们。 所有使用分区真正的做法是减less你需要从2到1的SQL语句的数量,并删除临时表。 要使用临时表,只需将上述查询的结果插入到该表中,然后从中进行SELECT并按PersonID和IsFaceToFace进行分组。