假设我有一个名为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 :(得分:3)
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
答案 1 :(得分: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
答案 2 :(得分:0)
select * from
(select name, hours, StartTime, Date,
SUM(hours) over (partition by name) as totalHours
from mytable) m1
where Date = GETDATE()
答案 3 :(得分: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
答案 4 :(得分: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'