【问题标题】:How to properly group data by distinct employee如何按不同的员工正确分组数据
【发布时间】:2020-11-30 21:15:46
【问题描述】:

我有两张数据表,一张是交易表,将每位员工与 2020 财年的软件使用情况联系起来,另一张是员工表。它们有一个称为 trackingid 的主键关系。因此,对于一名员工,他们可以进行许多交易。我们还会计算软件的使用小时数,并将其加总为使用天数。

我的目标是生成一份报告,其中显示不同用户、其他列以及正确分组的计算使用天数。每次我试图让选择起作用时,我都会得到 1 行每个软件实例的使用时间。

由于我不太擅长 SQL,我在 GROUP BY 和 AGGREGATE 函数上苦苦挣扎,我需要正确生成此输出。

select DISTINCT w.[TrackingId], w.[FirstName], w.[LastName], w.[Email], w.UserName, 
w.[OfficeAddress1], w.[OfficeCity],w.[OfficeCountry], w.[OfficePostCode], w.[SupervisorName],w.[Department], w.[DepartmentName],w.[Organization], t.ProductName, t.FiscalPeriod, t.UsageHours
from 
 dbo.Employee_Users w INNER JOIN
 dbo.SoftwareTransactions t ON w.TrackingID = t.TrackingId

示例数据如下所示:

FirstName,LastName,Email,UserName,OfficeAddress1,OfficeCity,OfficeCountry,OfficePostCode,SupervisorName,Department,DepartmentName,Organization,ProductName,FiscalPeriod,UsageHours
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q1-10,0.107
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q1-12,0.316
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q1-12,1.627
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-01,0.027
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-01,1.21
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-01,4.548
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-02,0.02
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-02,0.911
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-03,7.022
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-03,104.896
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q2-03,148.505
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q3-04,719.469
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q3-06,2260.458
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q4-07,616.381
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q4-09,1846.506
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,ARC/INFO,FY2020-Q4-09,2489.788
Employee1,Employee1LN,Employee1.Employee1LN@Company.com,Employee1LNA,Siemensstr 10,Neu-Isenburg,Germany,63263,"Supervisor1",A224,522.DEU EMIA MGMT Ops IT,52.Company GMBH.EUDEU1.A224,Viewer,FY2020-Q1-10,1.792

【问题讨论】:

  • 帮助我们帮助您 - 分享一些示例数据,以及您试图为此示例获得的结果
  • 好的,由于 GDPR,我可以分享的内容有限。让我清理一下,然后分享。
  • 它不需要是真实数据——即使是一些虚构的员工和交易数据也可以帮助说明你想要做什么
  • 我为一位用户添加了一些虚假数据。

标签: sql sql-server


【解决方案1】:

在实践中 SELECT DISTINCT 只是执行特定类型的 GROUP BY 的一种更简单的方法 - 您对每个字段进行 GROUP BY。

例如,

SELECT DISTINCT a, b, c
FROM mytable;

等价于

SELECT a, b, c
FROM mytable
GROUP BY a, b, c

但是,如果您想要按所有字段进行分组,则需要使用 GROUP BY 子句。

我做这些的方法是从我们期望在一行上的东西开始(和 GROUP BY 这些)。在您的情况下,我猜这将是每个会计年度的用户产品。

因此,我将从我们想要对其进行 GROUP BY 的所有相关行开始(注意 - 这只是最后一个字段)

select 
    w.[TrackingId], 
    w.[FirstName], 
    w.[LastName], 
    w.[Email], 
    w.UserName, 
    w.[OfficeAddress1], 
    w.[OfficeCity],
    w.[OfficeCountry], 
    w.[OfficePostCode], 
    w.[SupervisorName],
    w.[Department], 
    w.[DepartmentName],
    w.[Organization], 
    t.ProductName, 
    t.FiscalPeriod
from 
    dbo.Employee_Users w 
    INNER JOIN dbo.SoftwareTransactions t ON w.TrackingID = t.TrackingId
group by
    w.[TrackingId], 
    w.[FirstName], 
    w.[LastName], 
    w.[Email], 
    w.UserName, 
    w.[OfficeAddress1], 
    w.[OfficeCity],
    w.[OfficeCountry], 
    w.[OfficePostCode], 
    w.[SupervisorName],
    w.[Department], 
    w.[DepartmentName],
    w.[Organization], 
    t.ProductName, 
    t.FiscalPeriod;

上面应该给你正确的行数。

接着,添加“聚合”值 - 这些值包含多行并汇总为一个。

在你的情况下,我猜你想要总小时数(得到总小时数)。

所以最终的答案是

select 
    w.[TrackingId], 
    w.[FirstName], 
    w.[LastName], 
    w.[Email], 
    w.UserName, 
    w.[OfficeAddress1], 
    w.[OfficeCity],
    w.[OfficeCountry], 
    w.[OfficePostCode], 
    w.[SupervisorName],
    w.[Department], 
    w.[DepartmentName],
    w.[Organization], 
    t.ProductName, 
    t.FiscalPeriod,
    SUM(t.UsageHours) as TotalUsageHours    /* this is the only row added */
from 
    dbo.Employee_Users w 
    INNER JOIN dbo.SoftwareTransactions t ON w.TrackingID = t.TrackingId
group by
    w.[TrackingId], 
    w.[FirstName], 
    w.[LastName], 
    w.[Email], 
    w.UserName, 
    w.[OfficeAddress1], 
    w.[OfficeCity],
    w.[OfficeCountry], 
    w.[OfficePostCode], 
    w.[SupervisorName],
    w.[Department], 
    w.[DepartmentName],
    w.[Organization], 
    t.ProductName, 
    t.FiscalPeriod;

【讨论】:

  • 这很接近,记录数从 43536 增加到 7,382,但我知道我们没有 7,382 个用户。我认为产品名称和财务周期是问题的一部分,我需要它们在 where 子句中区分我的时间段和核心产品,但它们仍然显示每个用户的许多记录。我想把这个汇总到一个人身上,加上几个小时?这有意义吗?
  • 我想我明白了。我不得不改变我的 where 子句。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 2021-12-01
  • 2012-11-02
  • 2021-02-16
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多