c# - 内部报告所需的复杂小计

标签 c# sql linq excel reporting

我需要一个按 MemberName(PersonID) 返回小计的查询,但分为 2 个不同的 ContactTypes(11 & 12 在 IsFaceToFace 下)。下面的查询为我提供了我需要的基本数据,没有任何小计。

我尝试过使用 WITH ROLLUPPARTITION BY 但这些对我来说是新的并且从来没有完全正确地工作过。我确信我需要提供有关表结构的更多信息,但也许不需要。

此外,我的最终目标是在 Excel 2007 中为我们的内部财务团队提供此功能,因此我对任何 解决方案持开放态度。无论是 SQL、LINQ(虽然这使用 2 个数据库)、Reporting Services、Excel 宏、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

最佳答案

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

关于c# - 内部报告所需的复杂小计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2060165/

相关文章:

c# - 对象引用,无法找到用户 ID

C# 如何从 PasswordBox 中获取文本值?

c# - 为什么 ASP.NET Core、区域中的属性路由不起作用

mysql - 如何更改 View 中的数据类型?

c# - 是否有更有效的 LINQ 语句来反向搜索 List<T> 中的条件?

c# - 匹配委托(delegate) 'system.eventhandler' 没有重载

sql - 使用 Microsoft Access 查询结果中的行号

php - 加载 XML 本地 INFILE : REPLACE clause working in phpMyAdmin but not from PHP script

c# - 什么时候应该使用导航属性来查询数据库?

linq - 如何在linq查询中应用多个orderby