2014-02-05 38 views
0

什么是在MySQL中考虑Group By函数的最佳方式?MySQL按订单和计数(独特)

我正在写一个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 

其他注意事项:

-Employees可以工作任意天数。有些人正在工作4 x 10,其他人5 x 8,如果他们报名参加OT,可能需要第六天。如果我按周计算总数,我会得到每Emp_ID 3-7之间的任何地方。我希望本周能得到1分。

- 每位员工有不同的薪资代码,因此当我们按日查看时(VTO =自愿休假,OT =超过时间,LOA =休假等),独特的计数有帮助。不同的计数会告诉我1,在同一天里我经常会有2-3次为同一个雇主(命中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

如果你在'select'中没有聚合函数,为什么你在这个查询中有'group by'? –

回答

0

您在group by中使用的顺序无关紧要。每个值的独特组合都有自己的一组。选择你没有分组的列给你一些任意的结果;你可能想要在它们上使用一些聚合函数,比如SUM来获得组总数。

按照您从其他值中派生出来的值进行分组,如下所示,这些值不是很有用。

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

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

+0

我也觉得这样,但是没有办法做到这一点?我的意思是按该组在该组下按该组按年份排序,等等。 – Iqbal

+0

你得到的结果是“平坦的”,你不能在“其他结果”下面得到结果。您可以按网站,年份和星期对结果进行排序。 – Joni

+0

因此,如果我试图找出在任何特定周内我们的名册上有多少独特员工(在任何薪酬代码下列出了几个小时; VTO,OT,Reg,LOA等),我如何计算每周不同的员工? –