Question

I want to get the list of employees(vertically) and their work done arranged by weeks(horizontally), so far i've managed to write this code:

sql code

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

output

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

The output of this, is repeated the list of employees and repeated jobs done by weeks. What im doing wrong?

Thank you all for the help!

UPDATE: i've changed the code, now there is a problem with null values, there are no zeroes values :(

Was it helpful?

Solution 2

i've managed to solve my question by arrangin each week in month by this way:

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

and output:

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

OTHER TIPS

You are trying to do a cross tab or pivot query. Excel users are very familiar with this and usually like their data in this format.

Try putting your query result as the following, using SQL-Server's PIVOT [http://technet.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx] function, then output the resulting set. For your table headers, you can use the COLUMNLIST function.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top