如何从表中选择一列中的特定行作为其他行的值的总和?

时间:2013-12-11 14:46:00

标签: sql sql-server sql-server-2012

假设我有一个名为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)有记录时,才会弹出信息。 任何帮助将不胜感激。

5 个答案:

答案 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'