SQL Server-将日期转换为工作日,并在第二列中计算工作日的每个实例
想知道如何从表中选择:SQL Server-将日期转换为工作日,并在第二列中计算工作日的每个实例,sql,sql-server,database,Sql,Sql Server,Database,想知道如何从表中选择: FIELDID personID purchaseID dateofPurchase -------------------------------------------------- 2 13 147 2013-03-21 00:00:00 3 13 147 2013-03-23 00:00:00 4 13 456 2013-03-
FIELDID personID purchaseID dateofPurchase
--------------------------------------------------
2 13 147 2013-03-21 00:00:00
3 13 147 2013-03-23 00:00:00
4 13 456 2013-03-24 00:00:00
5 25 123 2013-03-21 00:00:00
6 25 123 2013-03-22 00:00:00
7 25 456 2013-03-21 00:00:00
8 25 456 2013-03-23 00:00:00
9 25 456 2013-03-28 00:00:00
10 25 789 2013-03-21 00:00:00
11 82 147 2013-03-22 00:00:00
12 82 456 2013-03-22 00:00:00
我想得到一个由两列组成的结果表:工作日和每个工作日的购买数量
到目前为止,我有这样的想法:
SELECT
CASE DATEPART(WEEKDAY, dateofPurchase)
WHEN 1 THEN 'Weekend'
WHEN 2 THEN 'Monday'
WHEN 3 THEN 'Tuesday'
WHEN 4 THEN 'Wednesday'
WHEN 5 THEN 'Thursday'
WHEN 6 THEN 'Friday'
WHEN 7 THEN 'Weekend'
END AS 'day',
COUNT(dateofPurchase) AS 'dates'
FROM
dbo.PurchaseRecord
GROUP BY
dateofPurchase;
但这会返回两个星期四行和两个周末行,因为它们是不同的周。我怎样才能让它每周四只返回一行,周末返回一行
谢谢按您想要的日期分组
GROUP BY CASE DATEPART(WEEKDAY, dt)
WHEN 1 THEN 'Weekend'
WHEN 2 THEN 'Monday'
WHEN 3 THEN 'Tuesday'
WHEN 4 THEN 'Wednesday'
WHEN 5 THEN 'Thursday'
WHEN 6 THEN 'Friday'
WHEN 7 THEN 'Weekend'
END
我在想:
SELECT v.wkday, COUNT(*) as dates
FROM dbo.PurchaseRecord pr CROSS APPLY
(VALUES (CASE WHEN DATEPART(WEEKDAY, dateofPurchase) IN (1, 7)
THEN 'Weekend'
ELSE DATENAME(WEEKDAY, dateofPurchase)
END)
) v(wkday)
GROUP BY dateofPurchase
GROUP BY v.wkday;
这将使用交叉应用
定义一次工作日
,因此它可以在选择
和分组依据
中使用。请注意,SQL Server有一个函数返回星期天的名称。你不需要一个CASE
表达式
编辑:
如果要计算唯一购买的数量,请使用count(DISTINCT)
:
与我的想法相比,这似乎太复杂了answer@Kevin . . . 如果您认为重复一个复杂的
case
表达式更简单,那么您就不必维护太多的代码了。我认为Gordon的答案更符合SQL的外观。像这样的案例陈述不仅难看,而且在一定程度上促进了硬编码,而且不太基于集合。与似乎没有经验的程序员理解和维护两个分组的交叉应用相反?我的意思是,如果你是新来的,你真的想在你更易受影响的时候被教坏习惯吗?谢谢,这很有帮助,因为我不再有两个星期四,但我仍然有两个周末——你知道我怎样才能把它变成一个周末吗?这是因为在这种情况下,sat和sun有两种不同的情况吗?为什么不将satruday和sunday标记为satruday和sunday?这是一种奇怪的业务要求
COUNT(DISTINCT purchaseId)