繁体   English   中英

在交叉表查询Access SQL中将记录计数显示为记录组总数的百分比

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM