SSRS轴名称独立于图表数据

时间:2014-02-10 16:54:59

标签: sql-server reporting-services

我有一张有两个轴的图表。一个是基于一系列日期,另一个是一年到头。我的问题是,请求图表的人希望我显示今年的数据和选定的日期,但现在希望我显示数据的所有可用组,无论它们是否存在于数据中。

更清晰一点。这是我正在使用的查询:

SELECT     COUNT(AdDate) AS ErrorCountYTD, BusinessUnit, '' AS ErrorCountCur
FROM         MasterAnnotation
WHERE     (ActualAgencyError = 'Yes') AND (Client = @Client) AND (DATEPART(YY, AdDate) = DATEPART(YY, sysdatetime())) AND (BusinessUnit IS NOT NULL) AND 
                      (BusinessUnit <> '') AND (AnnotationDate = 'Final_Proof')
GROUP BY BusinessUnit
UNION ALL
SELECT     '' AS ErrorCount, BusinessUnit, COUNT(AdDate) AS ErrorCountCur
FROM         MasterAnnotation AS MasterAnnotation_1
WHERE     (ActualAgencyError = 'Yes') AND (Client = @Client) AND (AdDate IN (@ReleaseAD)) AND (BusinessUnit IS NOT NULL) AND (BusinessUnit <> '') AND 
                      (AnnotationDate = 'Final_Proof')
GROUP BY BusinessUnit

因此,如果客户有15个业务部门,但他们在2014年没有活动,我将不会显示任何数据。有没有办法编写查询的第一部分,让业务部门独立于数据?我有一些业务部门在2013年生效,但没有任何问题要报告2014年。

我不确定这在查询中是否可行。

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,这在SQL中实际上非常容易。我不是故意冒犯,但听起来你可能没有很多SQL经验。如果是这种情况,我强烈建议您阅读一些SQL基础知识,特别是JOIN语句。

要解决此问题,您需要选择包含所有业务单位的一组数据,以及包含这些业务单位指标的第二组数据。然后,使用外部联接将这些集合连接在一起,以便持久保存业务单位的完整列表,无论它们是否具有相应的度量标准记录。

一个这样的例子,那是非常懒惰的,可能不是你想要的东西:

SELECT
    ma1.BusinessUnit
    ,ma2.ErrorCountCur
    ,ma2.ErrorCountYTD
FROM
(
SELECT DISTINCT
    BusinessUnit
FROM
    MasterAnnotation
) ma1
LEFT JOIN
( 
    SELECT
        BusinessUnit 
        ,'' AS ErrorCountCur
        ,COUNT(AdDate) AS ErrorCountYTD
    FROM
        MasterAnnotation
    WHERE
        ActualAgencyError = 'Yes'
        AND Client = @Client
        AND DATEPART(YY, AdDate) = DATEPART(YY, sysdatetime()) 
        AND BusinessUnit IS NOT NULL
        AND BusinessUnit <> ''
        AND AnnotationDate = 'Final_Proof'
    GROUP BY
        BusinessUnit
    UNION ALL
    SELECT 
        BusinessUnit
        ,COUNT(AdDate) AS ErrorCountCur
        ,'' AS ErrorCountYTD
    FROM
        MasterAnnotation AS MasterAnnotation_1
    WHERE
        ActualAgencyError = 'Yes' 
        AND Client = @Client
        AND AdDate IN (@ReleaseAD)
        AND BusinessUnit IS NOT NULL
        AND BusinessUnit <> '' 
        AND (AnnotationDate = 'Final_Proof')
    GROUP BY 
        BusinessUnit
) ma2
ON
    ma1.BusinessUnit = ma2.BusinessUnit

在这里,我将您的原始查询放入“子查询”,别名为“ma2”。我创建了一个我自己的新查询,我只选择不同的businessunit值(通常不是一个好的做法,特别是如果这个表包含大量记录)。

通过LEFT将它们连接在一起,我将从ma1(我的完整业务单位列表)获取所有记录,并获取其ErrorCounts的值 - 如果它们有任何记录。如果给定企业的ma2中没有相应的记录,则ErrorCount字段将返回“null”值,然后您可以根据需要处理这些值(替换为零,保留空值等)。

您可以调整每个子查询的WHERE子句以过滤到您需要的数据。 GROUP BY语句也可能不需要在子查询中。但实际上,上述查询只是一个例子。