Sql 如何为子“日志”记录的列名添加序列前缀(用于报告工具)

Sql 如何为子“日志”记录的列名添加序列前缀(用于报告工具),sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个父表CASES和子表UPDATES。每日例行程序将案例中的每一行记录到更新表中。这意味着每个案例都有一个更新,然后是多个更新 案例 更新 我可以使用以下查询- select *, (Row_Number() over (partition by CaseID order by UpdateDate desc)) as SeqNo from UPDATES order by SeqNo, CaseId 将更新数据分组并排序到临时表中,如- SeqNo | UpdateID | Upd

我有一个父表CASES和子表UPDATES。每日例行程序将案例中的每一行记录到更新表中。这意味着每个案例都有一个更新,然后是多个更新

案例

更新

我可以使用以下查询-

select *,
  (Row_Number() over (partition by CaseID order by UpdateDate desc)) as SeqNo
from UPDATES order by SeqNo, CaseId
将更新数据分组并排序到临时表中,如-

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...]
我们使用第三方报告库。为了能够将特定更新作为案例的子组件进行报告,我需要一个查询,该查询将数据作为一组简单的结果返回。换句话说,我需要呈现类似sq2_CaseStatus的内容来表示任何给定案例或案例集的第二次最新更新.CaseStatus数据。也就是说,CaseId被传递给报表代码,报表代码运行我的存储过程、我的SPs查询和返回结果集,以及结果集列上的报表代码键以查找数据

我只需要从更新表中显示12个最新的SeqNo值1-12。但我正在努力解决如何在主报告查询中查询和返回这些数据的问题

问题:如何从更新中查询和返回数据,以便显示SeqNo,并作为任何报告字段的前缀使用

如果我的线性思维是这样的话,请提前道歉

在我的报告查询中,有一个SELECT语句,它从案例中获取所有数据,并从其他链接表中选择数据。在这个SELECT中,我可以使用“循环”技术来调用特殊函数吗

此特殊函数将获取一个从1到12的计数器变量,使用该变量按SeqNo查询我的分组/顺序临时表,还使用该变量在“编码”列下显示数据。因此,我最终得到了12个子表链接回我的病例记录,如-

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表都非常广泛,所以我放弃了任何“扩展”单个临时表的选项,即为每个CaseId显示所有1-12个SeqNo数据集。此外,我意识到对报表接口代码的更改有助于解决这个问题,但我正试图避免这种代价高昂的选择

更新/解决方法:嗯,我不得不求助于我最初放弃的单一“宽”临时表解决方案。我使用递归脚本来帮助生成所需的MAX语句的长列表——这些语句生成带前缀的列名。然后,我将它们与一个内部联接结合起来,在一个表值函数中执行排序。类似于

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

不太好看。。。但它应该起作用

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

您可能需要使用将temp表更改为全局temp,以使其正常工作

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

正如我所说,它并不漂亮,甚至不建议出于性能考虑使用它,但在您的情况下,这可能是您正在寻找的解决方案。

您正在使用哪种报告工具?为了避免分心,不想在SQL中实现这一点,我不想说。我要说的是,它是一个流行的ASP.NET应用程序库,允许用户使用字段“代码”构建模板,即DOTs、XLT和设置数据输出位置——这些字段代码是我需要生成的。所以,假设我想要一个报告包含每个案例的一般信息,并且只输出它们的第二个最新或第三个或第四个,等等。更新。案例状态数据。。。如何以表格形式查询和返回更新数据,以便SeqNo能够选择它?@mjmoody383报告工具之所以相关,是因为您可能忽略了解决问题的更简单方法。你提供的相关信息越多,别人就越容易帮助你。有时,人们在解决某个特定问题时陷入了困境,而更改其他内容将更容易、更清晰地实现他们的目标。你是说要返回12个不同的结果集吗?@zespri更改“代码”即将SeqNo通过代码传递给我的查询会产生成本,但是从我的存储过程中以平面结果集的形式返回数据将与当前代码一起工作,因此是免费的,因此我正在寻找SQL解决方案。
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
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