C# Sql语句帮助
我正在ASP.Net上开发Gridview。我在SQL Server中有一个表,其中包含名为姓氏、日期日期时间和持续时间的列。这张桌子是用来请假的。我如何构造一个SQL语句来查看每天有多少人失踪?。关键是,查询SELECT[Date],COUNTDISTINCT names GROUP BY[Date]不会显示9月2日实际上有8人失踪。例如,给定以下数据:C# Sql语句帮助,c#,sql,sql-server,sql-server-2008,C#,Sql,Sql Server,Sql Server 2008,我正在ASP.Net上开发Gridview。我在SQL Server中有一个表,其中包含名为姓氏、日期日期时间和持续时间的列。这张桌子是用来请假的。我如何构造一个SQL语句来查看每天有多少人失踪?。关键是,查询SELECT[Date],COUNTDISTINCT names GROUP BY[Date]不会显示9月2日实际上有8人失踪。例如,给定以下数据: surname Date Duration ------- ---------- --------- Bertram 2011-
surname Date Duration
------- ---------- ---------
Bertram 2011-09-01 3
Coulois 2011-09-01 5
LeBlanc 2011-09-01 6
Fosters 2011-09-01 3
Blanche 2011-09-01 2
Bertram 2011-09-02 6
Gillian 2011-09-02 4
Pikklar 2011-09-02 7
Thierry 2011-09-03 6
Selanne 2011-09-03 6
我希望得到以下结果:
Date Count
----- -----
1 Sep 5
2 Sep 8
3 Sep 10
你知道如何处理这些数据并生成gridview吗?。谢谢你的时间你可以试试这样的东西
WITH Dates AS
(SELECT CAST('9/1/2011' AS DATE) AS [DATE]
UNION SELECT '9/2/2011'
UNION SELECT '9/3/2011'
)
SELECT [DATE], SUM(OnVacation) AS COUNT
FROM
(
SELECT [DATE],
CASE WHEN [DATE] BETWEEN StartDate AND DATEADD(dd, Duration, StartDate)
THEN 1 ELSE 0 END AS OnVacation
FROM Vacations
CROSS JOIN Dates
) x
GROUP BY [DATE]
ORDER BY [DATE]
Dates表将是一个包含要查看的日期列表的表。在这个查询中,它是一个常见的表表达式CTE
这还假设开始日期是持续时间的第一天。以下内容应为您提供从预订的第一天开始到预订的最后一天结束的所有假期的明细,而不仅仅是开始日期。还应报告零预订范围内的日期(如有)
2011-09-01 5
2011-09-02 8
2011-09-03 10
2011-09-04 9
2011-09-05 7
2011-09-06 7
2011-09-07 5
2011-09-08 4
2011-09-09 3
该代码计算出最后一个预订日期,然后计算动态日期范围内每天的所有预订
DECLARE @MaxDate date
SELECT @MaxDate = max(dateAdd(day, duration, date))
FROM holiday;
WITH HolidayDates (holidayDate)
as
(
SELECT MIN(date) holidayDate
FROM holiday
UNION ALL
SELECT DateAdd(day, 1, holidayDate)
FROM holidayDates
WHERE holidayDate <@MaxDate
)
SELECT cast(hd.holidayDate as date) holidayDate
, count(h.surname) PeopleOnHoliday
FROM HolidayDates hd
LEFT JOIN holiday h on hd.holidayDate between h.date AND dateAdd(day, duration, date)
GROUP BY hd.holidayDate
ORDER BY hd.holidayDate
希望这对您有所帮助……您可以使用。这里我使用master..spt\u值
declare @T table
(
surname varchar(20),
[Date] datetime,
Duration int
)
insert into @T values
('Bertram', '2011-09-01', 3),
('Coulois', '2011-09-01', 5),
('LeBlanc', '2011-09-01', 6),
('Fosters', '2011-09-01', 3),
('Blanche', '2011-09-01', 2),
('Bertram', '2011-09-02', 6),
('Gillian', '2011-09-02', 4),
('Pikklar', '2011-09-02', 7),
('Thierry', '2011-09-03', 6),
('Selanne', '2011-09-03', 6)
select dateadd(day, N.number, [Date]) as [Date],
count(*) as [Count]
from @T as T
inner join master..spt_values as N
on N.number between 0 and T.Duration
where N.type = 'P'
group by dateadd(day, N.number, [Date])
order by dateadd(day, N.number, [Date])
结果:
Date Count
----------------------- -----------
2011-09-01 00:00:00.000 5
2011-09-02 00:00:00.000 8
2011-09-03 00:00:00.000 10
2011-09-04 00:00:00.000 9
2011-09-05 00:00:00.000 7
2011-09-06 00:00:00.000 7
2011-09-07 00:00:00.000 5
2011-09-08 00:00:00.000 4
2011-09-09 00:00:00.000 3
我喜欢bobs的回答
这里是您需要创建一列日期列的CTE,给定开始和结束日期
DECLARE @start datetime = '2011-01-01'
DECLARE @end datetime = '2011-01-31'
; WITH Dates as
(
SELECT @start as d
UNION ALL
SELECT DATEADD(DAY, 1, d)FROM dates WHERE d < @end
)
SELECT * FROM Dates
如果您将其插入到他的答案中,并创建一个接受“开始”和“结束”参数的存储过程,您应该有您的答案。持续时间是否包括周末?是的,它包括周末实际日期是假期的开始日期,对吗?在我看来,你似乎没有一个人离开的每一天的日期,所以我们需要进行一些日期计算,以获得正确的日期。持续时间包括周末,还是不包括周末?要计算出谁在某一天离开,你需要从startdate到startdate+持续时间的每天记录。您可以创建另一个相关的子表来存储这些记录,并在创建父记录的同时创建记录,这将使查询数据变得更容易,或者您可以在查询中使用CTE或temp表动态创建这些记录,该表更复杂,但不需要更改DB。是的,但为了查看一年中的所有日期我必须播放一年中所有可用的日期?我建议您创建一个带有日期的表,或者创建一个更具活力的CTE。