0

我对 MS SQL Server 很陌生(我一直使用 SAS 拉)。

我有一个程序可以识别在特定月份没有见过的孩子 - 标准在下面以粗体显示。当我运行程序时,这是一个结果示例:

五月未见的孩子:

Person_ID Child_Name  Case_ID   Stage_ID  Unit  Worker_Name
37938354  Chrismary   25367048  28714173  P5G   Edith
37938357  Michael     25367048  28714173  P5G   Edith
29174158  Bryan       22229090  24456882  P5J   Elizabeth
22426348  Juan        24621782  27258653  P5C   Dalbin
37046338  Nathaniel   25154727  28232513  P5A   Vontaisha
38593370  Natalia     25154727  28232513  P5A   Vontaisha
36266293  Luzarely    25020393  27989836  P5C   Dalbin
35745702  Taneesa     24716363  27417204  P5E   Kathleen
28044496  Braulio     24926432  27909182  P5E   Elizabeth

我需要做的是根据我运行程序的月份添加 5 个额外的月份列,这将指示孩子是否在过去 5 个月内没有看到,值为“YES”、“NO”和“N/A” '。N/A 是当孩子不包括在特定月份的数据集中时。

我需要的示例:

Person_ID Child_Name  Case_ID   Stage_ID  Unit  Worker_Name  Seen_April Seen_March 
37938354  Chrismary   25367048  28714173  P5G   Edith          YES         YES    
37938357  Michael     25367048  28714173  P5G   Edith          NO          YES
29174158  Bryan       22229090  24456882  P5J   Elizabeth      NO          NO
22426348  Juan        24621782  27258653  P5C   Dalbin         YES         YES
37046338  Nathaniel   25154727  28232513  P5A   Vontaisha      N/A         N/A
38593370  Natalia     25154727  28232513  P5A   Vontaisha      YES         YES
36266293  Luzarely    25020393  27989836  P5C   Dalbin         YES         YES
35745702  Taneesa     24716363  27417204  P5E   Kathleen       YES         NO
28044496  Braulio     24926432  27909182  P5E   Elizabeth      YES         No

...并持续到 2 月、1 月、12 月。

在 SAS 中,我可以使用 Do Loop 来解决这个问题,但不知道如何使用 MS SQL Sever 来做到这一点。

您还会注意到我不得不对日期标准进行硬编码。在 SAS 中,我可以使用宏变量来选择日期示例:%let BegDate='2013-05-01' 和 %Let EndDate='2013-05-31'。是否可以在 MS SQL 服务器中创建宏变量?

这是程序:

SELECT 
distinct
a.Person_ID,
a.Child_Name,
b.Case_ID,
b.Stage_ID, 
b.Unit, 
b.Worker_Name
from 
(select
distinct 
Person_ID,
Child_Name
FROM gw_dw.dbo.DimContacts_Child  
where Unit in ('P5C','P4C','P5L','P5D','P5F','P5G','P5E','P5A','P5K','P5J') 
and (**Contact_Date >= '2013-05-01' AND Contact_Date <='2013-05-31**')
group by Person_ID,Child_Name
having sum(case when (Contact_Method='Face To Face') AND
                     (Contact_Result <> 'Attempted') AND
                     (Participant='Yes')
                then 1 else 0 end) = 0 ) as A 
inner join
(Select distinct --Addtional Query Beacuse there multipal units assigned to a child*/
Person_ID,
Case_ID,
Stage_ID, 
Unit, 
Worker_Name
from gw_dw.dbo.DimContacts_Child
where Unit in ('P5C','P4C','P5L','P5D','P5F','P5G','P5E','P5A','P5K','P5J') 
and (**Contact_Date >= '2013-05-01' AND Contact_Date <='2013-05-31'**)
group by Worker_Name,Unit,Person_ID,Case_ID,Stage_ID
having sum(case when (Contact_Method='Face To Face') AND
                     (Contact_Result <> 'Attempted') AND
                     (Participant='Yes')
                then 1 else 0 end) = 0  ) as B 
on  A.Person_ID = B.Person_ID   
order by a.Child_Name;

任何帮助表示赞赏。谢谢!

4

1 回答 1

0

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

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 1 行并将 DateSeen 的“交叉表”分为 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
于 2013-07-02T18:14:24.057 回答