2

我有一个父表CASES和子表UPDATES。每日例行程序将每一行记录CASESUPDATES表中。这意味着每个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),使用该变量来查询我的分组/排序#TEMPSeqNo,并使用该变量在“编码”列下显示数据。因此,我最终将有 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但是是否可以在语句中以这种方式“循环” ?

注意- 实际上,CASESUPDATES表都相当宽,所以我放弃了“扩大”我的单个#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
4

1 回答 1

1

它不漂亮......但它应该工作。

您可以在存储过程中使用 Dynamic Sql 来获取特定的子行并即时构造名称:

(您可能需要使用将临时表更改为全局临时表##才能完成这项工作)

CREATE PROCEDURE GetChild @chilSeq int
AS
DECLARE @sChild varchar(10)
set @sChild = convert(varchar(10), @childSeq)
DECLARE @dsql varchar(4000)
set @dsql = 'SELECT SeqNo, UpdateID, [sq'+ @sChild +'_UpdateDate], CaseID, [sq'+ @sChild +'_CaseStatus], [sq'+ @sChild +'_[other fields]]
FROM #temp where SeqNo = ' + @sChild

execute @dsql
GO

就像我说的那样,它并不漂亮,甚至不建议将其用于性能考虑,但在您的情况下,这可能是您正在寻找的解决方案。

于 2013-07-06T13:06:12.450 回答