声明一个标量变量,它接受列的每一行?

Declare a scalar variable which takes in every row of a column?

提问人:brins 提问时间:8/24/2023 最后编辑:Dale Kbrins 更新时间:8/25/2023 访问量:61

问:

我想声明一个变量,它接受我的 RDD 的每一行并进行一些计算并给我一个输出。

计算将包括它将返回一周的第一天,除非 RDD 落入新的月份,否则它将返回该月的第一天。

DECLARE @tbl TABLE
             (
                 RDD date
             )

INSERT INTO @tbl
    SELECT RDD 
    FROM tableA

DECLARE @testdate date

SELECT @testdate = RDD
FROM @tbl

SELECT
    CASE 
        WHEN MONTH(@testdate) = MONTH(DATEADD(day, 1-DATEPART(weekday, @testdate), @testdate))
            THEN DATEADD(day, 1-DATEPART(weekday, @testdate), @testdate)
            ELSE DATEADD(month, DATEDIFF(month, 0, @testdate), 0)  
    END AS FDW, 
    RDD,
    BPN, 
FROM
    tableA
WHERE
    RDD IS NOT NULL  
GROUP BY
    RDD, BPN

我尝试了以下操作并收到了以下输出:

CD2型 RDD型
2023-08-27 00:00:00:000 2024-06-19
2023-08-27 00:00:00:000 2024-02-22

这很奇怪,因为当我执行以下命令时:

DECLARE @TESTDATE DATE = '2024-06-19'

 

select
  case when month(@testdate) = month(dateadd(day,1-datepart(weekday,@testdate),@testdate))
       then dateadd(day,1-datepart(weekday,@testdate),@testdate)
       else DATEADD(month, DATEDIFF(month,0,@testdate),0)  
  end

我的输出是预期的 2024-06-16(一周的第一天,在我的情况下,一周从星期日开始)。

那么上面的查询有什么问题呢?为什么大小写表达式在那里不起作用?

sql-server 日期时间

评论

0赞 siggemannen 8/24/2023
嗯,你在从表中选择时使用了@testdata。选择月份(RDD)的大小写,即。表中的列,而不是变量?
0赞 Panagiotis Kanavos 8/24/2023
标题自相矛盾 - 列没有行,标量值只包含一个值(这就是意思),而不是多个值。如果您解释了您想要什么并显示示例数据和预期输出,而不是您认为解决方案的样子,那就更好了scalar
0赞 Panagiotis Kanavos 8/24/2023
无论如何,要从列的值中计算单个值,您需要一些聚合函数。 是唯一将多个结果行合并为一个的结果行。...等GROUP BYGROUP BY
0赞 Panagiotis Kanavos 8/24/2023
你昨天已经问过两次同样的事情了。你为什么不只使用你已经得到的答案之一呢? 将为您提供一周的开始时间,如果月份发生了变化,则为您提供月份。在那之后,什么SELECT GREATEST(DATETRUNC(month,RDD),DATETRUNC(week,RDD)) FROM TableA
3赞 Sean Lange 8/25/2023
这听起来很像 XY 问题

答:

0赞 vbif 8/25/2023 #1

正如我从您的问题中可以猜到的那样,您想为表格的每个日期获取一周的第一天,但是每个月的第一天都是月初?像这样的东西?tableA

select
  case
    when datediff(month,lag(RDD) over (order by RDD),RDD)>0 then DATEFROMPARTS(year(RDD),month(RDD),1) 
    else dateadd(day,1-datepart(weekday,RDD),RDD)
  end FDW,
  RDD,
  BPN
from
  TableA

或者,也许,您需要一周的开始日期,但如果是在其他月份,查询必须返回月份开始?

select
  (select max(DT) from (values(DATEFROMPARTS(year(RDD),month(RDD),1)) ,(dateadd(day,1-datepart(weekday,RDD),RDD))) SL(DT)) FDW,
  RDD,
  BPN
from
  TableA