2013-12-11 23 views
1

比方說,我有一個稱爲EmployeeInfo的表像下:如何從列表中選擇一列中的特定行作爲其他行的值的總和?

Name    Hours StartTime   Date 
John Smith   8   8:00    2013-12-11 
John Smith   7   7:00    2013-12-10 
John Smith   9   6:00    2013-12-09 
Tom Smith   6   9:00    2013-12-11 
Tom Smith   8   7:00    2013-12-10 
Tom Smith   7   5:00    2013-12-05 
Alex Smith   8   8:00    2013-12-10 

我想查詢到如下表返回:

Name    HoursToday HoursWeekly StartTime Date 
John Smith   8   24    8:00  2013-12-11 
Tom Smith   6   14    9:00  2013-12-11 

所有信息是從今天的日期,除了HoursWeekly,這是取從給定日期(可以說2013-12-9)到今天的總時數。只有當員工今天有記錄時(2013-12-11),信息纔會彈出。 任何幫助,將不勝感激。

+0

你嘗試過一個清潔的解決方案?通常這將通過內聯子查詢完成。 – Randy

+0

什麼版本的SQL Server? –

+0

@Randy SELECT Name,Hours,(從EmployeeInfo中選擇金額(小時數)WHERE日期'2013-12-9'和'2013-10-12'之間的日期),StartTime,Date FROM EmployeeInfo WHERE Date ='2013-12-11 」。但我不知道如何確保它計算出當前僱員的總時數 –

回答

2
DECLARE @t TABLE 
(
    Name VARCHAR(50), 
    Hours INT, 
    StartTime TIME, 
    Date1 DATE 
) 

INSERT INTO @t 
     SELECT 'John Smith', 8, '8:00', '2013-12-11' UNION ALL 
     SELECT 'John Smith', 7, '7:00', '2013-12-10' UNION ALL 
     SELECT 'John SMITH', 9, '6:00', '2013-12-09' UNION ALL 
     SELECT 'Tom Smith', 6, '9:00', '2013-12-11' UNION ALL 
     SELECT 'Tom SMITH', 8, '7:00', '2013-12-10' UNION ALL 
     SELECT 'Tom SMITH', 7, '5:00', '2013-12-05' UNION ALL 
     SELECT 'Alex SMITH', 8, '8:00', '2013-12-10' 

DECLARE @input DATE= '2013-12-9'; 

WITH cte1 AS 
(
    SELECT name, 
      hours HoursToday, 
      StartTime, 
      Date1 
    FROM @t 
    WHERE DATEDIFF(DAY, date1, GETDATE()) = 0 
), 
CTE AS 
(
    SELECT name, 
      SUM(hours) HoursWeekly 
    FROM @t 
    WHERE date1 BETWEEN @input AND GETDATE() 
    AND name IN (SELECT name FROM cte1) 
    GROUP BY name 
) 

SELECT a.Name, 
     a.HoursToday, 
     b.HoursWeekly, 
     a.StartTime, 
     a.Date1 
FROM cte1 A 
INNER JOIN cte B ON a.Name = b.Name 
+0

這很有用,謝謝! –

0
select * from 
(select name, hours, StartTime, Date, 
SUM(hours) over (partition by name) as totalHours 
from mytable) m1 
where Date = GETDATE() 
0

試試這個,沒有測試爲不具有相似的表,但邏輯應該工作

select Name, 
Sum(case when date = CONVERT(VARCHAR(10),GETDATE(),111) then Hours else 0 end) as HoursToday, 
Sum(case when date between dateadd(dd,-7,getdate()) and getdate() then Hours else 0 end) as HoursWeekly, 
Min(case when date = CONVERT(VARCHAR(10),GETDATE(),111) then StartTime else '' end) as StartTime, 
Date as Date 

where date = '2013-12-11' 
group by name,date 
0

我相信這會工作。

SELECT Name, Hours, 
(SELECT SUM(Hours) FROM EmployeeInfo WHERE Name = ei.Name 
    AND [Date] BETWEEN '12/4/2011' AND '12/11/2011') As HoursWeekly, 
StartTime, [Date] 
FROM EmployeeInfo ei WHERE ei.[Date] = '12/11/2011' 
2

比接受的答案

SELECT e1.Name, e1.Hours HoursToday, e2.HoursWeekly, e1.StartTime, e2.Date 
FROM EmployeeInfo e1 
JOIN (
    SELECT Name, MAX(Date) Date, SUM(Hours) HoursWeekly 
    FROM EmployeeInfo 
    WHERE Date >= CONVERT(DATE, GETDATE() - 7) 
    GROUP BY Name 
    HAVING MAX(Date) >= CONVERT(DATE, GETDATE()) 
) e2 ON e1.name = e2.Name AND e1.Date = e2.Date 
+0

它輸出每一個最後的開始時間,不僅僅是今天的時間,而且它計算所有的小時數,而不僅僅是本週的小時數。兩個where子句可以解決這個問題 –

+0

在子查詢中添加了'HAVING'子句,僅在日期比當前日期更新時才包含 – Tom

相關問題