SQL报告-连接两个没有公用列的表

时间:2018-12-12 18:04:55

标签: sql sql-server tsql reporting-services

我已经为我的组织创建了一个SQL报告,该报告具有:

.rdl文件,(报表生成器)

.sql文件,(在后面查询以获取数据)

.rml文件(“报告”屏幕)

后面的sql在大多数情况下都满足大多数规范,但是我需要一些洞察力和帮助以继续前进。该报告将根据用户输入特定日期或日期范围来显示所有日期卷(失败和成功)。我有3个表,这些表是我根据用户特定的日期(或日期范围)从中提取数据来满足的,这些失败的表头和在特定日期发生的所有成功的日期滚动:

  1. TaskHistory-当RollHeader发生故障时,包括有关失败原因的消息

  2. RollDetail- RollHeader成功后,Details来自此表

  3. RollHeader-报告已成功从该表中提取所有数据。

问题在于尝试映射两个表没有任何共同之处的数据 TaskHistory (其中我的RollHeader失败,并包含一条有关RollHeader失败原因的消息),并在以下位置显示这些字段那个报告。现在, RollHeader (抓取*该表中的数据)。该报告成功地从RollHeader和RollDetail中提取了所有内容。但是我不希望显示RollDetails,除非我的RollHeader尚未显示失败,它显示的是Rolldetails,但是我对如何继续使用我的查询从TaskHistory中成功捕获这些失败感到困惑。

这是我的测试用例(为便于说明):

在“报告”上使用特定的“日期”参数。您只会看到成功的日期滚动。失败日期记录信息将不再包括在内。

如果由于“系统偏好设置”选项,日期在周末未滚动,将没有RollHeader条目,但TaskTypeId 20,TaskstatusId -2的TaskHistory条目将显示RollHeader失败,并显示有关日期为何的消息没有滚动。我们将希望在报告中捕获此信息。

RollHeader故障不会显示在RollHeader表中。必须从TaskHistory表中捕获它们。没有失败的RollHeader的RollDetail条目。

这是我的查询

    DECLARE @DateRoll  INT, 
@Today DateTime,
@DateFrom VARCHAR(20),
@DateThru  VARCHAR(20)

SET @DateRoll= ?DateRoll
SET @Today= (SELECT InputDate FROM Control)
SET @DateFrom= 'DateFrom'
SET @DateThru= 'DateThru'



Select RH.NewDate, RH.RollDate, RH.StartTime AS HdrStartTime, RH.RollHeaderKey,
       RD.Descr, RD.EndTime, RD.RollDetailKey, RD.RollTaskNo, RD.StartTime AS DtlStartTime, TH.TaskStatusName, TH.Message,


CASE 
    WHEN RD.STATUS IS NULL THEN 'No Roll Detail Tasks'
    ELSE RD.Reason 
END AS Reason,



    CASE
    WHEN RD.Status=0 THEN '0-Waiting'
    WHEN RD.Status=1 THEN '1-In-Process'
    WHEN RD.Status=2 THEN '2-Failed'
    WHEN RD.Status=3 THEN '3-Succeeded'             
END AS RollDtlStatus,



    RD.TaskLevel, RD.TaskTime ,
    T.TaskTypeId, T.TaskStatusName,T.Message ,T.TaskSourceKey, T.TaskStatusId

FROM RollHeader RH
LEFT JOIN TaskHistory TH ON TH.TaskTypeId=20 AND TH.TaskStatusId=-2 AND TH.StartTime <= RH.StartTime AND TH.EndTime>= RH.EndTime 
LEFT JOIN RollDetail RD ON RH.RollHeaderKey = RD.RollHeaderKey 
LEFT JOIN TaskHistory T ON T.TaskSourceKey = RD.RollDetailKey 
AND T.TaskTypeId= 21


WHERE RH.RollDate = (CASE WHEN @DateRoll=0 THEN  dateadd(day,datediff(day,1,GETDATE()),0) 
                  WHEN @DateRoll=1 THEN  dateadd(day,datediff(day,2,GETDATE()),0) 
                          ELSE 0 END)



 OR @DateRoll=2 AND ((RH.RollDate>=@DateFrom ) AND (RH.RollDate<=@DateThru ))


ORDER BY RH.RollHeaderKey, RD.tasklevel, RD.RollTaskNo 

如果您在查询中看到,我已经尝试根据两个表中出现的时间间隔来映射TaskHistory和RollHeader表(因为我希望所有东西都出自RollHeader,而所有东西都出自Taskhistory,并且满足某些条件), (将Taskhistory中的start和endtime列与RollHeader中的开始时间进行比较)但是,当同一天发生成功的DateRoll时,只有成功的Dateroll才会得到认可并显示在此报告上,甚至无法识别TaskHistory中发生的rollheader失败。 / p>

我想要的结果:

1。)Rollheader表中的所有指定列

2。)TaskHistory中的所有指定列,其中taskstatusid = -2和Tasktypeid = 20(这将捕获所有Rollheader失败)

3。)Rollheader成功出现在Rollheader表中的rollheaderkey上的所有Rolldetails

尽管我的专业知识有限,但我一直试图在阐述此问题时尽量做到描述性。如果有人能帮助我获得替代或更好的方法,我将非常感激。我进行了搜索,但没有发现对我的问题有帮助或特定的信息。

欢迎所有反馈,因为我是该行业的新手,并尝试学习尽可能多的信息。

谢谢

0 个答案:

没有答案