两个日期之间寻找天数进行动态列(finding numbers of days between tw

2019-10-20 10:48发布

亲爱的,我目前将产生以下结果SELECT查询:

DoctorName Team 1 2 3 4 5 6 7 ... 31 Visited
dr. As   A                             x    x ...      2 times
dr. Sc   A                          x          ...      1 times
dr. Gh   B                                  x ...      1 times
dr. Nd   C                                     ... x    1 times

使用下面的查询:

DECLARE @startDate = '1/1/2010', @enddate = '1/31/2010'
SELECT d.doctorname,
         t.teamname,
         MAX(CASE WHEN ca.visitdate = 1 THEN 'x' ELSE NULL END) AS 1,
         MAX(CASE WHEN ca.visitdate = 2 THEN 'x' ELSE NULL END) AS 2,
         MAX(CASE WHEN ca.visitdate = 3 THEN 'x' ELSE NULL END) AS 3,
         ...
         MAX(CASE WHEN ca.visitdate = 31 THEN 'x' ELSE NULL END) AS 31,
         COUNT(*) AS visited
    FROM CACTIVITY ca
    JOIN DOCTOR d ON d.id = ca.doctorid 
    JOIN TEAM t ON t.id = ca.teamid
   WHERE ca.visitdate BETWEEN @startdate AND @enddate
GROUP BY d.doctorname, t.teamname

问题是我想使日期列是动态的,例如,如果ca.visitdate BETWEEN“2012/2/1” AND“2012/2/29”这样的结果将是:

DoctorName Team 1 2 3 4 5 6 7 ... 29 Visited
dr. As   A                             x    x ...      2 times
dr. Sc   A                          x          ...      1 times
dr. Gh   B                                  x ...      1 times
dr. Nd   C                                     ... x    1 times


有人可以帮我如何两个日期间获得的天数,并帮助我修改了查询,以便它可以循环MAX(CASE WHEN ca.visitdate = 1,则“X” ELSE NULL END)AS 1多达天数? 请请

Answer 1:

在SQL的基本规则是,任何给定的构造查询将始终返回相同的列 - 在有多少,他们的名字,他们的类型方面。

所以,你会看一个动态SQL方法来构造查询上的苍蝇,如果你还想走这条路线。 否则,它可能是值得看你是否能够在更高层次上抑制空列(这是将某种形式的报表处理器的 - 如SQL报告服务或Crystal Reports)

编辑1

您可能需要额外的列添加到您的查询,如:

CASE WHEN DATEPART(月,@起始日期)= DATEPART(月,DATEADD(天,29,@起始日期))THEN ELSE 1 0 END作为ShowColumn29

(和类似的其他数字)。 你怎么那么使用Reporting Services中,我@马有点模糊,但我认为你可以在你的报告结合到ShowColumn29值的某个位置添加一个隐藏的文本框,然后将报告给“29”栏目的知名度这个文本框的值。

对不起 - 我不是报告服务好,但希望你能玩的这种概念,并使其发挥作用?



文章来源: finding numbers of days between two date to make a dynamic columns