MySQL按顺序和计数组(不同)

时间:2014-02-05 15:51:20

标签: mysql count group-by odbc distinct

考虑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 

1 个答案:

答案 0 :(得分:0)

您在分组中使用的顺序无关紧要。每个值的唯一组合都有自己的一组。选择不分组的列会给你一些随意的结果;你可能想对它们使用一些聚合函数,例如SUM来获得组总数。

按照您在group by中使用的其他值派生的值进行分组,如下所示,不是很有用。

week(dkh.STATISTIC_DATE,4), dkh.STATISTIC_DATE

如果两行有不同的星期,它们也会有不同的日期,对吗?