Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何按不同的员工对数据进行正确分组_Sql_Sql Server - Fatal编程技术网

Sql 如何按不同的员工对数据进行正确分组

Sql 如何按不同的员工对数据进行正确分组,sql,sql-server,Sql,Sql Server,我有两个数据表,一个是事务表,将每个员工与2020财年的软件使用情况联系起来,另一个是员工表。它们有一个名为trackingid的主键关系。因此,对于一名员工来说,他们可能有许多交易。我们还计算软件的使用小时数,并将其相加为使用天数 我的目标是生成一个报告,显示不同的用户、其他列以及正确分组的计算使用天数。每次我试图让选择工作时,我都会得到每小时使用的软件实例的1行 由于我不太擅长SQL,我正在努力使用GROUP BY和AGGRATE函数来正确生成此输出 select DISTINCT w.[T

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

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

由于我不太擅长SQL,我正在努力使用GROUP BY和AGGRATE函数来正确生成此输出

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;