我有一个父表CASES
和子表UPDATES
。每日例行程序将每一行记录CASES
到UPDATES
表中。这意味着每个CASE
都有一个,然后是多个UPDATES
。
案例
CaseID | CaseStatus | [other fields]
=====================================
PK(int) | Free text | Free text...
更新
UpdateID | UpdateDate | CaseID | CaseStatus | [other fields]
===============================================================
PK(int) | Date Entered | FK(int) | Free text | Free text...
我可以使用以下查询 -
select *,
(Row_Number() over (partition by CaseID order by UpdateDate desc)) as SeqNo
from UPDATES order by SeqNo, CaseId
将UPDATES
数据分组和排序到一个#TEMP
表中,例如 -
SeqNo | UpdateID | UpdateDate | CaseID | CaseStatus | [other fields]
====================================================================
1 | 9876 | 30-Jun-2013 | 345 | [free text...]
1 | 9875 | 30-Jun-2013 | 789 | [free text...]
2 | 9765 | 29-Jun-2013 | 345 | [free text...]
2 | 9764 | 29-Jun-2013 | 789 | [free text...]
3 | 9654 | 28-Jun-2013 | 345 | [free text...]
4 | 9653 | 27-Jun-2013 | 345 | [free text...]
我们使用第 3 方报告库。为了能够报告特定UPDATES
的子组件CASES
,我需要一个将数据作为一组平面结果返回的查询。换句话说,我需要呈现类似sq2_CaseStatus
的东西来表示UPDATES.CaseStatus
任何给定CASE
或一组CASES
. (即,CaseId
是/被传递给报告代码,报告代码运行我存储的过程,我的 SP 查询和返回结果集,结果集列上的报告代码键以查找数据。)
我只需要提供表格中的 12个最新SeqNo
值 (1 - 12) 。UPDATES
但是我正在努力解决如何在我的主要报告查询中查询和返回这些数据。
问题:如何查询和返回数据,UPDATES
以便SeqNo
显示,并可作为任何报告字段的前缀?
如果我的线性思维当然在这里,请提前道歉......
在我的报告查询中,有一条SELECT
语句CASES
从其他链接表中获取所有数据并从中选择数据。在此范围内SELECT
,我可以使用“循环”技术来调用特殊函数吗?
这个特殊函数将采用一个计数器变量(从 1 到 12),使用该变量来查询我的分组/排序#TEMP
表SeqNo
,并使用该变量在“编码”列下显示数据。因此,我最终将有 12 个子表链接回我的CASE
记录,例如 -
SeqNo | UpdateID | sq1_UpdateDate | CaseID | sq1_CaseStatus | sq1_[other fields]
=================================================================================
1 | 9876 | 30-Jun-2013 | 345 | [free text...]
1 | 9875 | 30-Jun-2013 | 789 | [free text...]
SeqNo | UpdateID | sq2_UpdateDate | CaseID | sq2_CaseStatus | sq2_[other fields]
=================================================================================
2 | 9765 | 29-Jun-2013 | 345 | [free text...]
2 | 9764 | 29-Jun-2013 | 789 | [free text...]
and so on...
我认为这可行。SELECT
但是是否可以在语句中以这种方式“循环” ?
注意- 实际上,CASES
和UPDATES
表都相当宽,所以我放弃了“扩大”我的单个#TEMP
表的任何选项(即,SeqNo
为每个表显示所有 1-12 组数据CaseId
)。此外,我意识到更改报告界面代码可以帮助解决问题——但我试图避免这种(昂贵的)选项。
更新/解决方法:嗯,我不得不求助于#TEMP
我最初放弃的单一“宽”表解决方案。我使用了一个递归脚本来帮助生成我的一长串必需MAX
语句——这些语句会生成前缀列名。然后我将这些与INNER JOIN
表值函数中的(执行排序)结合起来。就像是...
SELECT up.CaseId AS CaseId,
MAX(CASE sq.SeqNo WHEN 1 THEN up.UpdateDate ELSE '' END) AS sq1_UpdateDate,
MAX(CASE sq.SeqNo WHEN 2 THEN up.UpdateDate ELSE '' END) AS sq2_UpdateDate,
...
...<up to sq12_ for all fields>...
...
FROM UPDATES up
INNER JOIN (
SELECT UpdateId,
Row_Number() OVER (PARTITION BY CaseId ORDER BY UpdateDate Desc) AS SeqNo
FROM UPDATES ) sq ON sq.UpdateId = up.UpdateId
GROUP BY up.CaseId