Sql server 计算和创建前几个月的列。你喜欢循环吗?

Sql server 计算和创建前几个月的列。你喜欢循环吗?,sql-server,loops,Sql Server,Loops,我对MS SQL Server非常陌生,我一直在使用SAS进行拉取 我有一个程序,可以识别在某个特定月份没有看到的儿童——下面的标准是粗体。当我运行程序时,这是一个结果示例: 5月份未见到的儿童: 我需要做的是根据我运行程序的月份添加5个额外的月份列,该列将显示在过去5个月内是否没有看到孩子,值为“是”、“否”和“N/A”。不适用是指特定月份的数据集中未包含子项 我需要的示例: …并持续到2月、1月、12月 在SAS中,我可以使用Do循环来解决这个问题,但不知道如何使用MS SQL Server

我对MS SQL Server非常陌生,我一直在使用SAS进行拉取

我有一个程序,可以识别在某个特定月份没有看到的儿童——下面的标准是粗体。当我运行程序时,这是一个结果示例:

5月份未见到的儿童:

我需要做的是根据我运行程序的月份添加5个额外的月份列,该列将显示在过去5个月内是否没有看到孩子,值为“是”、“否”和“N/A”。不适用是指特定月份的数据集中未包含子项

我需要的示例:

…并持续到2月、1月、12月

在SAS中,我可以使用Do循环来解决这个问题,但不知道如何使用MS SQL Server来解决这个问题

你也会注意到我不得不硬编码日期标准。在SAS中,我可以使用宏变量选择日期示例:%let BegDate='2013-05-01'和%let EndDate='2013-05-31'。是否有可能在MS SQL server中生成宏变量

节目如下:


感谢您的帮助。谢谢

这可以在SQL中完成。下面是一个包含两列的简单示例:

ID DateSeen
1  1/1/13
1  2/1/13
2  3/1/13
3  1/1/13
3  1/1/13
3  4/1/13
如果我没弄错你的问题,你想把它折叠成每个ID一行,把日期“交叉”成12列。试试这个:

Select ID, YEAR(Dateseen) as Seen_Year,
    sum(case when MONTH(Dateseen)=1 then 1 else 0 end) as Seen_Jan,
    sum(case when MONTH(Dateseen)=2 then 1 else 0 end) as Seen_Feb,
    sum(case when MONTH(Dateseen)=3 then 1 else 0 end) as Seen_Mar,
    sum(case when MONTH(Dateseen)=4 then 1 else 0 end) as Seen_Apr
from @tmp
group by id,YEAR(Dateseen)
这将使您对间距感到抱歉:

ID  Seen_Year   Seen_Jan    Seen_Feb    Seen_Mar    Seen_Apr
1   2013    1   1   0   0
2   2013    0   0   1   0
3   2013    2   0   0   1

不,请不要再考虑循环,而是考虑集合-嗨,谢谢。好的,我将不再考虑循环。我看了你的链接。不确定是否完全理解。首先要生成一组非常简单的月份。考虑一个集合{0,1,2,…}现在考虑将该集合转换为月份{DATEADDMONTH,0,'20130101',DATEADDMONTH,1,'20130101',…}-我认为第三篇文章将非常有用,但我认为您需要彻底阅读它们。我不认为10分钟算完全。对不起,我只看了你发的第一封邮件。where子句中的**是什么?
ID DateSeen
1  1/1/13
1  2/1/13
2  3/1/13
3  1/1/13
3  1/1/13
3  4/1/13
Select ID, YEAR(Dateseen) as Seen_Year,
    sum(case when MONTH(Dateseen)=1 then 1 else 0 end) as Seen_Jan,
    sum(case when MONTH(Dateseen)=2 then 1 else 0 end) as Seen_Feb,
    sum(case when MONTH(Dateseen)=3 then 1 else 0 end) as Seen_Mar,
    sum(case when MONTH(Dateseen)=4 then 1 else 0 end) as Seen_Apr
from @tmp
group by id,YEAR(Dateseen)
ID  Seen_Year   Seen_Jan    Seen_Feb    Seen_Mar    Seen_Apr
1   2013    1   1   0   0
2   2013    0   0   1   0
3   2013    2   0   0   1