1

亲爱的,我有一个选择查询,目前产生以下结果:

DoctorName Team 1 2 3 4 5 6 7 ... 31 拜访了医生
。作为 A x x ... 2 次
博士。Sc A x ... 1 次
博士。Gh B x ... 1 次
博士。Nd C ... x 1 次

使用以下查询:

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 '2/1/2012' AND '2/29/2012' 所以结果将是:

DoctorName Team 1 2 3 4 5 6 7 ... 29 拜访了医生
。作为 A x x ... 2 次
博士。Sc A x ... 1 次
博士。Gh B x ... 1 次
博士。Nd C ... x 1 次


有人可以帮助我如何获取两个日期之间的天数并帮助我修改查询,以便它可以循环 MAX(CASE WHEN ca.visitdate = 1 THEN 'x' ELSE NULL END) AS 1 和天数一样多?请请

4

1 回答 1

0

SQL 中的基本规则是,任何给定的构造查询将始终返回相同的列——根据有多少、它们的名称和它们的类型。

因此,如果您仍想沿着这条路线走下去,您将寻找一种动态 SQL 方法来动态构建查询。否则,可能值得看看您是否可以在更高级别抑制空列(这是否适用于某种形式的报告处理器 - 例如 SQL 报告服务或水晶报告?)

编辑 1

您可能希望在查询中添加其他列,例如:

CASE WHEN DATEPART(month,@StartDate) = DATEPART(month,DATEADD(day,29,@StartDate)) THEN 1 ELSE 0 END as ShowColumn29

(对于其他数字也是如此)。然后如何在报告服务中使用它,我@ma 有点含糊,但我认为您可以在报告的某处添加一个隐藏的文本框,该文本框绑定到 ShowColumn29 值,然后将报告的“29”列的可见性设置为此文本框的值。

抱歉 - 我不太擅长报告服务,但希望你能尝试一下这种概念并让它发挥作用?

于 2010-03-19T08:35:58.730 回答