【问题标题】:SQL query to create view for RDLC report为 RDLC 报告创建视图的 SQL 查询
【发布时间】:2019-01-25 11:50:10
【问题描述】:

我有一份这种格式的报告

Objectives 表中要传递给报告的列是

ObjectiveID, GoalDescription, Objective, Measure, Expectation, Comment

反对

S/N, Departmental Objective/Initiative, Employee Tasks, Performance Measure, 
Performance Expectation,  Comments

列。

以下是目标表的数据:

对于工作角色能力部分,列是

CompetenceID, CompetenceAreaDetailsDescription, CompetenceAreaDetailsExpectation

反对

S/N, Behaviours/Skills/Expectation, Expectations

列。

以下是能力表的数据:

Objective 表中的记录总数为 9。它是一对多列,即被评估者可以有多个目标。 Competence 表中的记录总数为 13 条,也是一对多表,即被评估者可以具有多种能力。

两个表中唯一匹配的数据是AppraiseeId

我的问题:如何创建一个视图来连接这两个表,以便作为报告的数据源。

为了进一步说明,我想显示 Objective 表中的 6 条记录,其中 AppraiseeId = 6 在“目标、任务、度量和目标”部分中,因为它有 6 个目标分配给他并且只显示 3 种能力从能力表的工作角色能力部分分配给他/她。

我已经编写并重写了相当多的查询,但它只会导致许多重复的记录。

CREATE VIEW [dbo].PlanningReport
AS
    SELECT
        "SpecificObjective"."ObjectiveId" "ObjectiveID",
        "SpecificObjective"."AppraiseeId" "AppraiseeID",
        "SpecificObjective"."Objective" "Objective",
        "SpecificObjective"."Expectation" "Expectation",
        "SpecificObjective"."Measure" "Measure",
        "SpecificObjective"."Comment" "Comment",
        "Competence"."CompetenceAreaDetailsDescription",
        "CompetenceAreaDetailsDescription",
        "Competence"."CompetenceAreaDetailsExpectation",
        "CompetenceAreaDetailsExpectation",
        "Competence"."ID" "CompetenceID",
        "Competence"."AppraiseeId" "CompetenceAppraiseId",
    FROM
        "dbo"."SpecificObjective" "SpecificObjective"
    LEFT JOIN 
        "dbo"."Employees" "Appraisee" ON "SpecificObjective"."AppraiseeId" = "Appraisee"."UserId"
    INNER JOIN
        "dbo"."Competence" "Competence" ON "SpecificObjective".AppraiseeId = "Competence".AppraiseeId
GO

我被困住了。请就该怎么做提出建议。

【问题讨论】:

  • 请不要提供数据图片。如果您要提供样本数据,请提供text,更好的是,还提供CREATEINSERT 语句。

标签: sql sql-server reporting-services rdlc sql-server-data-tools


【解决方案1】:

我会做一个类似以下的 UNION。然后,您可以过滤 AppraiseeId 上的视图,并为按 RowTypeId 区分的报告的每个部分选择所需的列。

CREATE Report_View

AS

Select 

ObjectiveId, 
AppraiseeId,
1 AS RowTypeId,
Description, 
Objective,
Expectation,
Measure,
Comment

FROM Objective


UNION ALL

SELECT
NULL AS ObjectiveId,
AppraiseeId,
2 AS RowTypeId,
CompetenceAreaDetailsDescription AS Description
NULL AS Objective
CompetenceAreaDetailsExpectation AS Expectation
NULL AS Measure
NULL AS Comment

FROM Competence

【讨论】:

  • 感谢您的指导。这次我已经能够在三张桌子上进行联合。现在正在过滤数据。会不断更新。谢谢一堆。欣赏!
  • 仁!我已经能够让它按需要工作。谢谢
【解决方案2】:

如果我是你,我不会将“特定目标”加入“能力”。
如果“AppraiseeId”是它们之间唯一的共同字段?
然后它是多对多关系,由此产生的笛卡尔连接效应不是那么有用。

最好只创建 2 个视图。
因为报告中的 2 个部分似乎是分开的。

CREATE VIEW [dbo].[vwUserSpecificObjectives] AS
SELECT
 obj.ObjectiveId AS ObjectiveID
,obj.AppraiseeId AS AppraiseeID
,obj.Objective
,obj.Expectation
,obj.Measure
,obj.Comment
FROM dbo.SpecificObjective AS obj;
GO

CREATE VIEW [dbo].[vwUserCompetences] AS
SELECT
 comp.CompetenceAreaDetailsDescription
,comp.CompetenceAreaDetailsExpectation
,comp.ID AS CompetenceID
,comp.AppraiseeId AS CompetenceAppraiseId
FROM dbo.Competence AS comp;
GO

如果您的工具仅支持一个表/视图数据源,那将无济于事。
但是,如果您的工具可以从 XML 中获取数据,那么也许您可以选择目标和能力作为 XML。

您可以在 dbfiddle here

上对其进行测试

示例:

CREATE VIEW [dbo].[PlanningReport]
AS
SELECT 
 emp.ID AS EmpID,
 emp.FullName AS EmpFullName,
 (
       SELECT
         obj.ObjectiveId AS "@ID",
         obj.Objective AS "Objective",
         obj.Expectation AS "Expectation",
         obj.Measure AS "Measure",
         obj.Comment AS "Comment"
        FROM dbo.SpecificObjective AS obj
        WHERE obj.AppraiseeId = emp.ID
        FOR XML PATH('Objective'), ROOT('Objectives'), TYPE
 ) AS Objectives,
 (
        SELECT
        comp.ID AS "@ID",
        comp.CompetenceAreaDetailsDescription,
        comp.CompetenceAreaDetailsExpectation
        FROM dbo.Competence AS comp
        WHERE comp.AppraiseeId = emp.ID
        FOR XML PATH('Competence'), ROOT('Competences'), TYPE
 ) AS Competences
FROM dbo.Employee emp;

【讨论】:

  • 感谢您的回复。我实际上使用的是一个名为 Codeontime 的 RAD 工具,它只支持将一个数据集嵌入到报告中,因此我有理由将这两个表结合起来。请问还有什么建议吗?
  • 如果 Codeontime 工具能够从 XML 中获取数据,那么可能通过根据 UserId 将目标和能力选择为 XML 类型。或者在 Jen Tadros 解决方案中使用 UNION。
  • @hopeforall 不确定该 Codeontime 工具是否可以用它做任何事情,但我添加了一个示例,将这些目标和能力作为 XML。
  • 谢谢,我会使用建议的解决方案并恢复。欣赏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多