列组百分比

Column group percentages

如何将单独列组中的两列与行组总计进行比较以获得百分比?行按 [trx_dt] 分组。直接和间接列按 [labor_type] 分组并过滤以分别显示直接和间接人工。目标是让每一天的总计以及总计以百分比及其实际值表示。

这是没有百分比的报告现在的样子

编辑:2015 年 7 月 13 日:我可以使用

获得总行中的百分比
=Sum(Fields!lbr_hrs.Value)/Sum(Fields!lbr_hrs.Value, "DataSet1")

有没有办法将列组的总值与行组的总值隔离开来进行比较?

编辑 7/16/15 回应第一条评论: 在第一行中,我想要 4.83 和 3.17 作为 8 的百分比。这将给我每天的百分比。

这里是查询:

SELECT 'P' AS RecordType,CASE WHEN mctrxhst_sql.wc != 'INDIRECT' then 'DIRECT' else 'INDIRECT' END AS labor_type, mctrxhst_sql.trx_dt,mctrxhst_sql.ord_no, 
        mctrxhst_sql.oper_no, mctrxhst_sql.desc_1, mctrxhst_sql.lbr_hrs, mccrwhst_sql.emp_no, mccrwhst_sql.lbr_grd, sfordfil_sql.item_no
    FROM mctrxhst_sql 
    LEFT OUTER JOIN sfordfil_sql ON sfordfil_sql.ord_no=mctrxhst_sql.ord_no
    LEFT OUTER JOIN hzctrfil_sql ON hzctrfil_sql.dept=mctrxhst_sql.dept AND hzctrfil_sql.wc=mctrxhst_sql.wc
    LEFT OUTER JOIN hzcdefil_sql ON hzcdefil_sql.hz_cd=mctrxhst_sql.dept AND hzcdefil_sql.cd_type='DP'
    LEFT OUTER JOIN mccrwhst_sql ON mccrwhst_sql.job_no=mctrxhst_sql.job_no AND mccrwhst_sql.ord_no=mctrxhst_sql.ord_no AND mccrwhst_sql.path_no=mctrxhst_sql.path_no
                                AND mccrwhst_sql.oper_no=mctrxhst_sql.oper_no AND mccrwhst_sql.oper_seq_no=mctrxhst_sql.oper_seq_no AND mccrwhst_sql.pln_act_cd=mctrxhst_sql.pln_act_cd
                                AND mccrwhst_sql.trx_dt=mctrxhst_sql.trx_dt AND mccrwhst_sql.control_no = mctrxhst_sql.control_no
    CROSS JOIN compfile_sql
    WHERE mctrxhst_sql.pln_act_cd = '1' AND mctrxhst_sql.rec_type='O'
        AND mctrxhst_sql.trx_dt BETWEEN @from AND @to 
        AND mctrxhst_sql.dept = 'MFG'
        AND mccrwhst_sql.emp_no IN (@Employee)
UNION

    SELECT 'U' AS RecordType, CASE WHEN mctrxfil_sql.wc != 'INDIRECT' then 'DIRECT' else 'INDIRECT' END AS labor_type, mctrxfil_sql.trx_dt,  mctrxfil_sql.ord_no, mctrxfil_sql.oper_no, mctrxfil_sql.desc_1,mctrxfil_sql.lbr_hrs, mccrwfil_sql.emp_no, mccrwfil_sql.lbr_grd, sfordfil_sql.item_no
    FROM mctrxfil_sql
    LEFT OUTER JOIN sfordfil_sql ON sfordfil_sql.ord_no=mctrxfil_sql.ord_no
    LEFT OUTER JOIN hzctrfil_sql ON hzctrfil_sql.dept=mctrxfil_sql.dept AND hzctrfil_sql.wc=mctrxfil_sql.wc
    LEFT OUTER JOIN hzcdefil_sql ON hzcdefil_sql.hz_cd=mctrxfil_sql.dept AND hzcdefil_sql.cd_type='DP'
    LEFT OUTER JOIN mccrwfil_sql ON mccrwfil_sql.job_no=mctrxfil_sql.job_no AND mccrwfil_sql.ord_no=mctrxfil_sql.ord_no AND mccrwfil_sql.path_no=mctrxfil_sql.path_no
                                AND mccrwfil_sql.oper_no=mctrxfil_sql.oper_no AND mccrwfil_sql.oper_seq_no=mctrxfil_sql.oper_seq_no AND mccrwfil_sql.pln_act_cd=mctrxfil_sql.pln_act_cd
                                AND mccrwfil_sql.trx_dt=mctrxfil_sql.trx_dt AND mccrwfil_sql.control_no = mctrxfil_sql.control_no
    CROSS JOIN compfile_sql
WHERE mctrxfil_sql.pln_act_cd = '1' AND mctrxfil_sql.rec_type = 'O'
        AND mctrxfil_sql.trx_dt BETWEEN @from AND @to
        AND mctrxfil_sql.dept  = 'MFG'
        AND mccrwfil_sql.emp_no IN (@Employee)

我在这里寻求 SQL 解决方案,因为不知道您拥有的所有内容的版本是什么,因此很难给出有效的答案。我基于 SQL2008(不是 R2)所以它可以在那个或更高版本上工作。

这种方法意味着必须放弃报告,但它应该非常简单,因为大部分工作都是在 SQL 方面完成的。

在此示例中,我刚刚构建了一个临时文件 table (#t),在其中转储了一些值,然后 运行 对其进行查询以获取结果。计算的主要部分是两个 SELECT 联合在一起,一部分通过 employee/date 计算数据,下一部分计算员工总数。

如果你决定实施这个,那么你 可以 用你的查询替换对 dbo.#t 的引用,但我个人会获取查询结果并将它们转储到临时 table 中,就像我在示例中所做的那样,它只是让它更清晰一些(恕我直言)。

首先,检查此 SQL Fiddle 的输出并确保它按预期工作 http://sqlfiddle.com/#!3/9eecb7/2070/0

假设它看起来没问题(忽略日期格式,我在英国)然后执行以下操作,如果这有点愚蠢但我不知道你的经验水平,请原谅我。

在您的报告中,通过将整个内容包装在 SELECT.. INTO 中来更改您的查询,然后添加紧接着执行计算的位,就像这样...

SELECT o.* INTO #t
FROM
(
  **your entire original query here**
) as o

SELECT DISTINCT -- this part does the emp/date totals
t.emp_no, t.trx_dt
, SUM(case t.labor_type WHEN 'INDIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no, t.trx_dt) AS InDirect -- sums indirect hours
, SUM(case t.labor_type WHEN 'DIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no, t.trx_dt) AS Direct -- sums direct hours
, SUM(case t.labor_type WHEN 'INDIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no, t.trx_dt) / SUM(t.lbr_hrs) over(PARTITION BY t.emp_no, t.trx_dt) AS InDirectShare -- sums indirect hours then divides by total
, SUM(case t.labor_type WHEN 'DIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no, t.trx_dt) / SUM(t.lbr_hrs) over(PARTITION BY t.emp_no, t.trx_dt)   AS DirectShare -- sums direct hours then divides by total
FROM dbo.#t t
UNION ALL 
SELECT DISTINCT -- this section is as above but with the date partitioning removed
t.emp_no, NULL
, SUM(case t.labor_type WHEN 'INDIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no) AS InDirect
, SUM(case t.labor_type WHEN 'DIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no) AS Direct
, SUM(case t.labor_type WHEN 'INDIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no) / SUM(t.lbr_hrs) over(PARTITION BY t.emp_no) AS InDirectShare
, SUM(case t.labor_type WHEN 'DIRECT' THEN t.lbr_hrs ELSE 0 END) over(PARTITION BY t.emp_no) / SUM(t.lbr_hrs) over(PARTITION BY t.emp_no)   AS DirectShare
FROM dbo.#t t

您可能希望在最后一位添加一个排序列,以帮助您对报告中的结果进行排序。我没有在这个例子中包含它,但可能只是第一部分中的 0 AS SortOrder 和第二部分中的 1 as SortOrder。然后您可以按 SortOrder 然后按 Date

对报告进行排序

希望这对您有所帮助,如果有任何不清楚的地方请告诉我,我会尽力解释...