我需要一个按会员名称( PersonID )返回小计的查询,但突破了2个不同的 ContactTypes ( 11& ; IsFaceToFace下的12个)。下面的查询为我提供了我需要的基本数据,没有任何小计。
我尝试使用WITH ROLLUP
和PARTITION 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
答案 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导出工具,可以很好地输出这种简单。
它还受益于订阅工具,您可以通过邮件或放置在文件共享中来安排将报告的定时运行发送给用户。