[英]Showing a record count as a percentage of totals of groups of records in a crosstab query, Access SQL
我在访问中建立了一个离线数据库,对数据进行分组时,我按公司ID分组,然后按日期分组,然后按预备大小分组。 然后还有一个进一步的分类来显示每个记录的破损。 破损分为5类,然后使用数据透视表将其转换为列标题。
我需要计算一个子组的记录计数属于该组的百分比。
我有数据透视表来生成结果,但是我缺少的是将该数字显示为该行总数的百分比。 因此,在第一个记录上,我想将5 + 2 + 2 + 3 + 3加起来等于15,并将每个值显示为15的百分比。
当前表结果:
Bag_Company_ID,Shift_Date,Prelim_Size,1-不间断,2-切碎,3-轻度破碎,4-重度破碎,5-碎片
10 2016/05/20 10 ct 5 2 2 3 3
10 2016/05/20 3-4 ct 4 5 1 3 5
10 2016/05/20 3-6 Gr 1 2 1 3 0
TRANSFORM Count(list_Breakages.Class_Cat) AS Cat
SELECT tbl_Bags.Bag_Company_ID, Format([Audit_PreVal_Date],"Short Date") AS Shift_Date, Client_Parcels.Prelim_Size
FROM list_Breakages INNER JOIN (tbl_Bags INNER JOIN Client_Parcels ON tbl_Bags.Bag_ID = Client_Parcels.Bag_ID) ON list_Breakages.Breakages_ID = Client_Parcels.Breakages
WHERE (((Client_Parcels.Prelim_Size) Is Not Null))
GROUP BY tbl_Bags.Bag_Company_ID, Format([Audit_PreVal_Date],"Short Date"), Client_Parcels.Prelim_Size
PIVOT list_Breakages.Class_Cat;
您将需要使用交叉表作为源的其他查询。 交叉表是一种特殊查询,除整个集合外,不允许在透视值中使用表达式。 但是,在这样做之前,将Count(list_Breakages.Class_Cat)
添加为新字段,该字段将用作第二个查询的分母:
交叉表查询
TRANSFORM Count(list_Breakages.Class_Cat) AS Cat
SELECT tbl_Bags.Bag_Company_ID, Format([Audit_PreVal_Date],"Short Date") AS Shift_Date,
Client_Parcels.Prelim_Size, Count(list_Breakages.Class_Cat) As TotalCatCount
FROM list_Breakages
INNER JOIN (tbl_Bags
INNER JOIN Client_Parcels ON tbl_Bags.Bag_ID = Client_Parcels.Bag_ID)
ON list_Breakages.Breakages_ID = Client_Parcels.Breakages
WHERE (((Client_Parcels.Prelim_Size) Is Not Null))
GROUP BY tbl_Bags.Bag_Company_ID, Format([Audit_PreVal_Date],"Short Date"),
Client_Parcels.Prelim_Size
PIVOT list_Breakages.Class_Cat;
Pct查询
SELECT c.Bag_Company_ID, c.Shift_Date, c.Prelim_Size,
(c.[1 - Unbroken] / c.TotalCatCount) As c.[1-Unbroken_Pct],
(c.[2 - Chipped] / c.TotalCatCount) As c.[2-Chipped_Pct],
(c.[3 - Lightly Broken] / c.TotalCatCount) As c.[3-Lightly-Broken_Pct],
(c.[4 - Heavily Broken] / c.TotalCatCount) As c.[4-Heavily-Broken_Pct],
(c.[5 - Fragment] / c.TotalCatCount) As c.[5-Fragment_Pct]
FROM CrossTabQuery c
或者,考虑条件聚合查询,尤其是由于您的枢轴列只有少数几个。这通常是大多数RDMS中使用的枢轴查询形式(因为交叉表是MS Access SQL所独有的)。 在此,允许使用分层表达式。 如果您的列值运行20+,请考虑上述第二种查询方法:
SELECT tbl_Bags.Bag_Company_ID, Format([Audit_PreVal_Date],"Short Date") AS Shift_Date,
Client_Parcels.Prelim_Size,
SUM(IIF(list_Breakages.Class_Cat = '1 - Unbroken', 1, 0)) /
Count(list_Breakages.Class_Cat) AS [1 - Unbroken],
SUM(IIF(list_Breakages.Class_Cat = '2 - Chipped', 1, 0)) /
Count(list_Breakages.Class_Cat) AS [2 - Chipped],
SUM(IIF(list_Breakages.Class_Cat = '3 - Lightly Broken', 1, 0)) /
Count(list_Breakages.Class_Cat) AS [3 - Lightly Broken],
SUM(IIF(list_Breakages.Class_Cat = '4 - Heavily Broken', 1, 0)) /
Count(list_Breakages.Class_Cat) AS [4 - Heavily Broken],
SUM(IIF(list_Breakages.Class_Cat = '5 - Fragment', 1, 0)) /
Count(list_Breakages.Class_Cat) AS [5 - Fragment]
FROM list_Breakages
INNER JOIN (tbl_Bags
INNER JOIN Client_Parcels ON tbl_Bags.Bag_ID = Client_Parcels.Bag_ID)
ON list_Breakages.Breakages_ID = Client_Parcels.Breakages
WHERE (((Client_Parcels.Prelim_Size) Is Not Null))
GROUP BY tbl_Bags.Bag_Company_ID, Format([Audit_PreVal_Date],"Short Date"),
Client_Parcels.Prelim_Size;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.