我希望获得员工列表(垂直)并按周(水平)安排完成工作,到目前为止,我已设法编写此代码:
sql代码
SELECT EP.EMPLOYEE_ID,EP.EMPLOYEE_NAME,EP.EMPLOYEE_SURNAME,WEEK=DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1,
WORKS=SUM(CASE WHEN PW.WORK_ID IS NOT NULL THEN 1 ELSE 0 END)
FROM EMPLOYEE_POSITIONS EP
LEFT OUTER JOIN PRO_WORKS PW ON PW.PROJECT_EMP_ID=EP.EMPLOYEE_ID
WHERE EP.POSITION_STATUS=1 AND DATEPART(MM,PW.RECORD_DATE)=#attributes.month# AND DATEPART(YY,PW.RECORD_DATE)=#session.ep.period_year#
GROUP BY EP.EMPLOYEE_ID,DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1,EP.EMPLOYEE_NAME,EP.EMPLOYEE_SURNAME
ORDER BY EP.EMPLOYEE_NAME,EP.EMPLOYEE_SURNAME
输出
<cfoutput query="get_works" group="employee_id">
<tr height="20" onMouseOver="this.className='color-light';" onMouseOut="this.className='color-row';" class="color-row">
<td>#EMPLOYEE_NAME# #EMPLOYEE_SURNAME#</td>
<cfoutput>
<td>#WORKS# - #WEEK#</td>
</cfoutput>
</tr>
</cfoutput>
这个的输出重复了员工名单和几周重复的工作。 我做错了什么?
谢谢大家的帮助!
更新:我已经更改了代码,现在存在空值问题,没有零值:(
答案 0 :(得分:1)
您正在尝试进行cross tab或pivot查询。 Excel用户对此非常熟悉,并且通常喜欢这种格式的数据。
尝试使用SQL-Server的PIVOT [http://technet.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx]函数将查询结果如下所示,然后输出结果集。对于表格标题,您可以使用COLUMNLIST函数。
答案 1 :(得分:0)
我已经设法通过这种方式每个月通过arrangin解决我的问题:
SELECT EP.EMPLOYEE_ID,EP.EMPLOYEE_NAME,EP.EMPLOYEE_SURNAME,
WEEK1=SUM(CASE WHEN (DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1)=1 THEN 1 ELSE 0 END),
WEEK2=SUM(CASE WHEN (DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1)=2 THEN 1 ELSE 0 END),
WEEK3=SUM(CASE WHEN (DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1)=3 THEN 1 ELSE 0 END),
WEEK4=SUM(CASE WHEN (DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1)=4 THEN 1 ELSE 0 END),
WEEK5=SUM(CASE WHEN (DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1)=5 THEN 1 ELSE 0 END),
WEEK6=SUM(CASE WHEN (DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, PW.RECORD_DATE), 0), PW.RECORD_DATE) +1)=6 THEN 1 ELSE 0 END)
FROM EMPLOYEE_POSITIONS EP
LEFT OUTER JOIN PRO_WORKS PW ON PW.PROJECT_EMP_ID=EP.EMPLOYEE_ID
WHERE EP.POSITION_STATUS=1 AND DATEPART(MM,PW.RECORD_DATE)=#attributes.month# AND DATEPART(YY,PW.RECORD_DATE)=#session.ep.period_year#
GROUP BY EP.EMPLOYEE_ID,EP.EMPLOYEE_NAME,EP.EMPLOYEE_SURNAME
ORDER BY EP.EMPLOYEE_NAME,EP.EMPLOYEE_SURNAME
并输出:
<cfoutput query="get_works">
<tr height="20" onMouseOver="this.className='color-light';" onMouseOut="this.className='color-row';" class="color-row">
<td>#EMPLOYEE_NAME# #EMPLOYEE_SURNAME#</td>
<td style="text-align:center;">#week1#</td>
<td style="text-align:center;">#week2#</td>
<td style="text-align:center;">#week3#</td>
<td style="text-align:center;">#week4#</td>
<td style="text-align:center;">#week5#</td>
<td style="text-align:center;">#week6#</td>
</tr>
</cfoutput>