考虑MySQL中的Group By功能的最佳方法是什么?
我正在编写一个MySQL查询,通过Excel中的数据透视表中的ODBC连接提取数据,以便用户可以轻松访问数据。
例如,我有:
Select
statistic_date,
week(statistic_date,4),
year(statistic_date),
Emp_ID,
count(distict Emp_ID),
Site
Cost_Center
我正在尝试按周计算我们所拥有的独特员工数量。我遇到的问题是在年底左右,日历年并不总是匹配所以按日期排序是很重要的,这样我就可以使用数据透视表手动过滤到正确的日期(2013/2014已经一周我们不得不加上第53周+第1周。
我正在尝试使用不同的分组语句,但我不确定顺序是如何重要的,当我切换它时会发生什么变化。
即
Group by week(statistic_date,4), Site, Cost_Center, Emp_ID
VS
Group by Site, Cost_Center, week(statistic_date,4), Emp_ID
其他注意事项:
- 员工可以在任何天数工作。有些人正在工作4 x 10,其他人工作5 x 8,如果他们报名参加OT,可能会有第6天。如果我按周计算计数,我会得到每个Emp_ID 3-7之间的任何数字。我希望本周获得1分。
- 每位员工有不同的薪资代码,因此当我们白天查看时(VTO =自愿休息时间,OT =时间过长,LOA =缺勤等)时,不同的计数会有所帮助。不同的计数将显示我1,在同一天我经常会有2-3次同一个emp(点击40小时并开始累积OT然后接受VTO或在同一天使用个人时间)。
我从一个我写的查询开始,了解我们按周付费的小时数。我正在尝试为此应用程序调整它。实际代码如下:
SELECT
dkh.STATISTIC_DATE AS 'Date'
,week(dkh.STATISTIC_DATE,4) as 'Week'
,month(dkh.STATISTIC_DATE) as 'Month'
,year(dkh.STATISTIC_DATE) as 'Year'
,dkh.SITE AS 'Site ID Short'
,aep.LOC_DESCR as 'Site Name'
,dkh.EMPLOYEE_ID AS 'Employee ID'
,count(distinct dkh.EMPLOYEE_ID) AS 'Distinct Employee ID'
,aep.NAME AS 'Employee Name'
,aep.BUSINESS_TITLE AS 'Business_Ttile'
,aep.SPRVSR_NAME AS 'Manager'
,SUBSTR(aep.DEPTID,1,4) AS 'Cost_Center'
,dkh.PAY_CODE
,dkh.PAY_CODE_SHORT
,dkh.HOURS
FROM metrics.DAT_KRONOS_HOURS dkh
JOIN metrics.EMPLOYEES_PUBLIC aep
ON aep.SNAPSHOT_DATE = SUBDATE(dkh.STATISTIC_DATE, DAYOFWEEK(dkh.STATISTIC_DATE) + 1)
AND aep.EMPLID = dkh.EMPLOYEE_ID
WHERE dkh.STATISTIC_DATE BETWEEN adddate(now(), interval -1 year) AND DATE(now())
group by dkh.SITE, SUBSTR(aep.DEPTID,1,4), week(dkh.STATISTIC_DATE,4), dkh.STATISTIC_DATE, dkh.EMPLOYEE_ID
答案 0 :(得分:0)
您在分组中使用的顺序无关紧要。每个值的唯一组合都有自己的一组。选择不分组的列会给你一些随意的结果;你可能想对它们使用一些聚合函数,例如SUM来获得组总数。
按照您在group by中使用的其他值派生的值进行分组,如下所示,不是很有用。
week(dkh.STATISTIC_DATE,4), dkh.STATISTIC_DATE
如果两行有不同的星期,它们也会有不同的日期,对吗?