按周安排,sql和coldfusion

时间:2014-04-15 15:32:34

标签: sql-server coldfusion

我希望获得员工列表(垂直)并按周(水平)安排完成工作,到目前为止,我已设法编写此代码:

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>

这个的输出重复了员工名单和几周重复的工作。 我做错了什么?

谢谢大家的帮助!

更新:我已经更改了代码,现在存在空值问题,没有零值:(

2 个答案:

答案 0 :(得分:1)

您正在尝试进行cross tabpivot查询。 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>
相关问题