在表格中显示最近31条记录和每个月的最后一个工作日(不包括周六,周日,但可以包括假期)

时间:2019-08-06 19:49:38

标签: sql-server tsql

我有一个表格,我要在其中显示这些值中的每一个的最近31条记录-蓝色,红色,绿色和这3个值以及所有紫色记录的每月最后一个工作日。

Color   Count   date
blue    3   2019-03-24
red     4   2019-03-24
green   2   2019-03-24
violet  1   2019-03-23
blue    3   2019-03-23
... ... ...
Blue    31  2016-01-31

营业日是指该月的最后一天,如果是星期六或星期日,则应显示星期五。如果是工作日,则该天将是该月的最后一个工作日。

我创建了以下查询,但没有显示每个月的最后一个工作日。我在做什么错,做此查询的正确方法是什么?

SELECT  color,count,date
FROM(
     SELECT *, ROW_NUMBER() OVER(PARTITION BY color ORDER BY date DESC) RN
     FROM table
    ) V
WHERE V.RN < 32
     AND color  IN ('blue','Red','Green') or color = 'violet'
     and CAST(DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)) - CASE DATENAME(dw, DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)))
        WHEN 'SUNDAY' THEN 2
        WHEN 'SATURDAY' THEN 1
        ELSE 0
        END AS DATE) != CAST(date AS DATE) 
    and color  IN ('blue','Red','Green') or color = 'violet'    
    order by color desc

预期输出:每月的前31条记录,红色的前31条记录,绿色的前31条记录及其最后一个工作日(仅不包括周末)以及所有紫色的记录。 < / p>

我得到的是每3个值有31条记录,所有紫罗兰色记录,但不是每个月的最后一个工作日

1 个答案:

答案 0 :(得分:0)

我弄清楚我做错了什么。在两个地方只有很小的变化,现在查询可以正常工作了。

正确的查询是:

SELECT  color,count,date
FROM(
     SELECT *, ROW_NUMBER() OVER(PARTITION BY color ORDER BY date DESC) RN
     FROM table
    ) V
WHERE RN < 32
     AND color  IN ('blue','Red','Green') OR color = 'violet'
     OR CAST(DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)) 
     - CASE DATENAME(dw, DATEADD(d, - 1, DATEADD(mm, DATEDIFF(mm, 0, date) + 1, 0)))
        WHEN 'SUNDAY' THEN 2
        WHEN 'SATURDAY' THEN 1
        ELSE 0
        END AS DATE) = CAST(date AS DATE)
    and color  IN ('blue','Red','Green') OR color = 'violet'    
    ORDER BY color desc