【问题标题】:Basic Cursor in MS SQL ServerMS SQL Server 中的基本光标
【发布时间】:2013-09-09 14:52:04
【问题描述】:

我正在寻找有关在 MSSS 中使用光标的基本方向。

假设有一个表 TABLE1,有 2 个字段(IDDate)。 ID 不是唯一键。该表按 id 记录事件,有些 id 经常出现,有些不经常出现。

例如:

ID  |  Date
1   |  2010-01-01
2   |  2010-02-01
3   |  2010-02-15
2   |  2010-02-15
4   |  2010-03-01

我想创建一个包含以下字段的新表:ID、日期、ID 在 Date 之前 6 个月内出现的次数、ID 在 Date 之后 6 个月内出现的次数。

有没有最好的方法来完成这个?非常感谢。

【问题讨论】:

  • 这听起来不像需要光标。带有COUNT()CASEGROUP BY 的基本SELECT 应该作为一个集合产生整个结果。
  • 这个不需要光标,你想从哪个日期开始计算 6 个月之前或之后。
  • 不要浪费时间学习游标——了解如何避免游标!
  • @Damien_The_Unbeliever 你能解释一下在这种情况下如何使用 Case 吗?

标签: sql sql-server tsql cursor


【解决方案1】:

这是一方面(我认为 - 未测试)

select t1.id, t1.date, count(*) as 'count'
from table t1 
join table t2 
  on t2.id = t1.id
 and DateDiff(mm,t1.date,t2.date) <= 6 
 and DateDiff(mm,t1.date,t2.date) >  0 
group by t1.id, t1.date

我认为你可以跳过 > 0 和用例来计算正负数

sum(WHEN t1.date > t2.date then 0 else 1) as prior 
sum(WHEN t1.date < t2.date then 0 else 1) as next 

and DateDiff(mm,t1.date,t2.date) <= 6 
and DateDiff(mm,t2.date,t2.date) <= 6 

可能有前后倒退

【讨论】:

  • 目前只有1张桌子,t2你有什么想法?
  • T2 是别名。你没见过自我加入吗?你试过了吗?
  • 我现在正在尝试这个——它似乎不喜欢 datediff 格式。谢谢你的帮助。此外,我还将此问题移至新问题,以避免光标误称。
  • 有一个逗号应该是句号。而且您不应该重新发布相同的问题。编辑现有问题。
猜你喜欢
  • 1970-01-01
  • 2020-05-15
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
相关资源
最近更新 更多