2014-07-14 52 views
0

下面的查詢工作完美,但它返回的時間兩行,我不想總小時數列返回兩個輸出,而不是一個

SELECT 
    USERINFO.name, USERINFO.BADGENUMBER, 
    departments.deptname, APPROVEDHRS.hours, 
    sum(workingdays) as workingdays,TotalWorkingDays 
FROM 
    (SELECT DISTINCT 
     (DATEDIFF(DAY, '2014-06-01', '2014-06-30') + 1) - 
      DATEDIFF(WEEK, '2014-06-01', '2014-06-30') * 2 - 
      (CASE WHEN DATEPART(WEEKDAY, '2014-06-01') = 5 THEN 1 ELSE 0 END) - 
      (CASE WHEN DATEPART(WEEKDAY, '2014-06-30') = 6 THEN 1 ELSE 0 END) AS TotalWorkingDays, 
     COUNT(DISTINCT DATEADD(d, 0,DATEDIFF(d, 0, CHECKINOUT.CHECKTIME))) AS workingdays, 
     USERINFO.BADGENUMBER, USERINFO.NAME, hours 
    FROM 
     USERINFO 
    LEFT JOIN 
     CHECKINOUT ON USERINFO.USERID = CHECKINOUT.USERID 
    LEFT JOIN 
     departments ON departments.deptid = userinfo.DEFAULTDEPTID 
    LEFT JOIN 
     APPROVEDHRS ON APPROVEDHRS.userid = userinfo.userid 
    WHERE 
     (DEPARTMENTS.DEPTNAME = 'xyz') 
     AND (CHECKINOUT.CHECKTIME >= '2014-06-01') 
     AND (CHECKINOUT.CHECKTIME <= '2014-06-30') 
    GROUP BY 
     hours, USERINFO.BADGENUMBER, deptname, USERINFO.NAME, 
     CONVERT(VARCHAR(10), CHECKINOUT.CHECKTIME, 103)) blue 
GROUP BY 
    name, BADGENUMBER, workingdays, TotalWorkingDays, deptname, hours 

上述查詢的輸出:

name BADGENUMBER  deptname  hours 
--------------------------------------------------- 
abc  1111    xyz   00:07:59  
abc  1111    xyz   00:08:00  
pqr  2222    qwe   NULL 

現在總學時(APPROVEDHRS表)表是:

BADGENUMBER  NAME DATE  HOURS 
------------------------------------------------- 
1111   xyz 2014-06-15  00:07:59 
1111   xyz 2014-06-14  00:08:00 
1111   xyz 2014-07-20  00:10:00 

我從20獲取記錄14-06-01至2014-06-30

所以我想下面的輸出:

name  BADGENUMBER  deptname  hours 
--------------------------------------------------------  
    abc  1111    xyz   00:15:59  

    pqr  2222   qwe    NULL 

幫助我獲得這個所需的輸出。

謝謝

+0

請您SQLFiddle包括有關問題的數據。這似乎是一個舍入或時間計算的問題,但沒有數據將很難提供幫助。 – Dbloch

+0

我已編輯查詢並刪除所有不必要的行..請立即嘗試 –

回答

0

第一件事情,你可能需要在查詢中使用的表名,所以你可以看數據來自哪裏,例如

select name,BADGENUMBER,deptname,hours, 

...會更容易爲已讀:

select ??.name,??.BADGENUMBER,??.deptname,APPROVEDHRS.hours, 

...或者你可以使用別名在查詢中的「FROM」的一部分,使這個更容易理解嗎?

無論如何,基本問題似乎是您按日期過濾CHECKINOUT表,但您不過濾APPROVEDHRS表。爲了解決這個問題,你可以改變從這個您的加盟:

left join APPROVEDHRS on APPROVEDHRS.userid = userinfo.userid 

這樣:

left join APPROVEDHRS on APPROVEDHRS.userid = userinfo.userid 
AND (APPROVEDHRS.DATE >='2014-06-01') AND (APPROVEDHRS.DATE <='2014-06-30') 

...並回答你問題(這可能應已創建的新問題在StackOverflow上)。這取決於[hours]字段的數據類型是什麼。我試圖修復你的查詢作爲一個起點,但它是有點棘手,不知道數據類型是什麼,等等。

因此,它看起來像小時是VARCHAR(?),似乎很奇怪,但在這裏請注意,我假設你的「時間」字段始終是格式「??:HH:MM.SSS」和您只需要添加小時和分鐘:

WITH Data AS (
    SELECT 
     DATEDIFF(DAY, '2014-06-01', '2014-06-30') + 1 - 
      DATEDIFF(WEEK, '2014-06-01', '2014-06-30') * 2 - 
      CASE WHEN DATEPART(WEEKDAY, '2014-06-01') = 5 THEN 1 ELSE 0 END - 
      CASE WHEN DATEPART(WEEKDAY, '2014-06-30') = 6 THEN 1 ELSE 0 END AS TotalWorkingDays, 
     COUNT(DISTINCT DATEADD(d, 0,DATEDIFF(d, 0, c.CHECKTIME))) AS WorkingDays, 
     d.deptname, 
     u.BADGENUMBER, 
     u.NAME, 
     CONVERT(INT, SUBSTRING([Hours], 4, 2)) AS [hours], 
      CONVERT(INT, SUBSTRING([Hours], 7, 2)) AS [minutes] 
    FROM 
     USERINFO u 
     LEFT JOIN CHECKINOUT c ON c.USERID = u.USERID 
     LEFT JOIN departments d ON d.deptid = u.DEFAULTDEPTID 
     LEFT JOIN APPROVEDHRS a ON a.userid = u.USERID 
    WHERE 
     d.DEPTNAME = 'xyz' 
     AND c.CHECKTIME >= '2014-06-01' 
     AND c.CHECKTIME <= '2014-06-30' 
    GROUP BY 
     d.deptname, 
     u.BADGENUMBER, 
     u.NAME, 
     CONVERT(INT, SUBSTRING([Hours], 4, 2)), 
      CONVERT(INT, SUBSTRING([Hours], 7, 2))) 
SELECT 
    Name, 
    BADGENUMBER, 
    deptname, 
    '00:' + CONVERT(VARCHAR(3), SUM([hours]) + ':' + CONVERT(VARCHAR(3), SUM([minutes]) + '.000' AS [Hours], 
    SUM(WorkingDays) AS WorkingDays, 
    TotalWorkingDays 
FROM 
    Data 
GROUP BY 
    Name, 
    BADGENUMBER, 
    deptname, 
    TotalWorkingDays; 

...如果這工作我一定會感到驚訝:P

0

如果你是左加入ApprovedHrs表,那麼你就需要限制(使用WHERE子句或連接子句)從七月的批准時間從附帶的日期。

爲了澄清這一點,我將完全限定ApprovedHrs.Hours的小時數字段,以便更清楚地說明這是從哪裏來的(我只是假設「小時」來自ApprovedHrs--如果我錯了就糾正我)。

你只是留在用戶ID加盟,所以它看起來像ApprovedHrs將帶來一切從ApprovedHrs用戶.--吉姆

+0

打我吧,幾乎相同的點:D –

+0

是的,你是正確的。小時來自ApprovesHrs –

0

我認爲這是因爲GROUP BY hourshours值不同,它會創建一個新的行該記錄

相關問題