Sql 如何按不同的员工对数据进行正确分组
我有两个数据表,一个是事务表,将每个员工与2020财年的软件使用情况联系起来,另一个是员工表。它们有一个名为trackingid的主键关系。因此,对于一名员工来说,他们可能有许多交易。我们还计算软件的使用小时数,并将其相加为使用天数 我的目标是生成一个报告,显示不同的用户、其他列以及正确分组的计算使用天数。每次我试图让选择工作时,我都会得到每小时使用的软件实例的1行 由于我不太擅长SQL,我正在努力使用GROUP BY和AGGRATE函数来正确生成此输出Sql 如何按不同的员工对数据进行正确分组,sql,sql-server,Sql,Sql Server,我有两个数据表,一个是事务表,将每个员工与2020财年的软件使用情况联系起来,另一个是员工表。它们有一个名为trackingid的主键关系。因此,对于一名员工来说,他们可能有许多交易。我们还计算软件的使用小时数,并将其相加为使用天数 我的目标是生成一个报告,显示不同的用户、其他列以及正确分组的计算使用天数。每次我试图让选择工作时,我都会得到每小时使用的软件实例的1行 由于我不太擅长SQL,我正在努力使用GROUP BY和AGGRATE函数来正确生成此输出 select DISTINCT w.[T
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
实际上,SELECT DISTINCT只是执行特定类型的GROUP BY的一种更简单的方法,即按每个字段分组 比如说,
SELECT DISTINCT a, b, c
FROM mytable;
相当于
SELECT a, b, c
FROM mytable
GROUP BY a, b, c
但是,如果不想按所有字段分组,则需要使用GROUPBY子句
我这样做的方式是从我们期望的一行开始(并按这些分组)。在您的情况下,我猜它将是每个会计年度用户的产品
因此,我将从我们想要分组的所有相关行开始(注意——这是最后一个字段)
上面应该给出正确的行数
在此基础上,添加“聚合”值-这些值包含多行并汇总为一行
在你的情况下,我猜你想要小时的总和(得到总小时数)
所以最后的答案是
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;
“帮助我们”帮助您-共享一些示例数据,以及您尝试获取的此样本的结果。由于GDPR,我仅限于我可以共享的内容。让我整理一下,然后分享。它不需要是真实的数据-即使是一些伪造的员工和交易数据也可以帮助说明你想做什么。我为一个用户添加了一些虚假数据。这很接近,记录数从43536增加到7382,但我知道我们没有7382个用户。我认为productname和fiscalperiod是问题的一部分,我需要它们在我的where子句中区分我的时间段和核心产品,但它们仍然显示每个用户的许多记录。我想把这个汇总到一个人身上,加上小时数?这有意义吗?我想我明白了。我不得不改变我的where子句。
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;