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)