检索项目类型、它们的子类型以及这些类型和子类型的计数

Retrieve item types, their subtype, and counts of those types and subtypes

根据@Gordon Linoff

的回答,请参阅下面的第一次编辑

第二个 edit/messy 解决方案见底部

原题

我有3张桌子;

tblOrganisations
tblOrganisationTypes
tblOrganisationSubTypes

一个组织可以有一个类型,一些类型可以有一个子类型

我正在尝试获取类型和子类型的列表和计数,但我在计算类型具有子类型的位置时遇到问题。

下面的查询和代码;

<CFQUERY NAME="RetrieveAllOrganisationTypes" DATASOURCE="#strDev#">
    SELECT tblOrganisations.tblOrganisationTypes_ReferenceID , COUNT(tblOrganisations.tblOrganisationTypes_ReferenceID) AS TypeCount , COUNT(tblOrganisations.tblOrganisationSubTypes_ReferenceID) AS SubTypeCount , tblOrganisationTypes.OrganisationType , tblOrganisationSubTypes.OrganisationSubType
            FROM (( tblOrganisations
            LEFT JOIN tblOrganisationTypes ON tblOrganisations.tblOrganisationTypes_ReferenceID = tblOrganisationTypes.ReferenceID )
            LEFT JOIN tblOrganisationSubTypes ON tblOrganisations.tblOrganisationSubTypes_ReferenceID = tblOrganisationSubTypes.ReferenceID )
            GROUP BY tblOrganisations.tblOrganisationTypes_ReferenceID , tblOrganisations.tblOrganisationSubTypes_ReferenceID
            ORDER BY tblOrganisationTypes.OrganisationType , tblOrganisationSubTypes.OrganisationSubType
</CFQUERY>

<CFOUTPUT QUERY="RetrieveAllOrganisationTypes" GROUP="OrganisationType">
    #OrganisationType# (#TypeCount#)<BR>
    <CFIF OrganisationSubType IS NOT ""><CFOUTPUT GROUP="OrganisationSubType">-- #OrganisationSubType# (#SubTypeCount#)<BR></CFOUTPUT></CFIF>
</CFOUTPUT>

明白了;

AFFILIATED (2)
ASSOCIATE (15)
FULL (10)
-- operator (10)
-- manufacturer (4)
-- owner (108)
-- survey company (4)
-- supplier (4)
GOVERNMENT (5)
MISCELLANEOUS (3)
SCIENCE (4)

但是你看,完整计数 - 10 - 是错误的。应该是130!对于没有子类型的类型,计数是正确的。子类型计数是正确的。我已经尝试了各种方法,但我一无所获:(

任何帮助将不胜感激! :)

第一次编辑

在@Gordon Linoff 的帮助下,添加 WITH ROLLUP,删除 ORDER BY,并使用以下代码;

<CFOUTPUT QUERY="RetrieveAllOrganisationTypes" GROUP="OrganisationType">
    #OrganisationType# (#TypeCount#) #SubTypeCount#<BR>
    <CFIF OrganisationSubType IS NOT ""><CFOUTPUT GROUP="OrganisationSubType">-- #OrganisationSubType# (#TypeCount#) #SubTypeCount#<BR></CFOUTPUT></CFIF>
</CFOUTPUT>

我现在明白了;

AFFILIATED (2) 2
ASSOCIATE (15) 15
FULL (10) 10
-- operator (10) 10
-- manufacturer (4) 4
-- owner (108) 108
-- survey company (4) 4
-- supplier (4) 4
-- (130) 130
GOVERNMENT (5) 5
MISCELLANEOUS (3) 3
SCIENCE (4) 4
(159) 159

所以你看我得到了 130,但是我怎样才能得到 130 的完整值?!

第二个edit/messy解

所以我想这是一个有点混乱的解决方案,但它有效!

如下输出代码;

<CFOUTPUT QUERY="RetrieveAllOrganisationTypes" GROUP="OrganisationType">
    <CFOUTPUT GROUP="OrganisationSubType">
    <CFIF OrganisationSubType IS "" AND OrganisationType IS NOT "">#OrganisationType# (#TypeCount#)<BR></CFIF>
    </CFOUTPUT>
    <CFOUTPUT GROUP="OrganisationSubType">
    <CFIF OrganisationSubType IS NOT "" AND OrganisationType IS NOT "">--#OrganisationSubType# (#SubTypeCount#)<BR></CFIF>
    </CFOUTPUT>
</CFOUTPUT>

给我;

AFFILIATED (2)
ASSOCIATE (15)
FULL (130)
--operator (10)
--manufacturer (4)
--owner (108)
--survey company (4)
--supplier (4)
GOVERNMENT (5)
MISCELLANEOUS (3)
SCIENCE (4)

我确定可能有更简洁的方法来执行此操作,如果有人知道,我愿意接受建议,但目前 - 这是可行的:)

这是您使用 table 别名的查询,因此更容易阅读:

SELECT o.tblOrganisationTypes_ReferenceID ,     
       COUNT(o.tblOrganisationTypes_ReferenceID) AS TypeCount , 
       COUNT(o.tblOrganisationSubTypes_ReferenceID) AS SubTypeCount , 
       ot.OrganisationType , ost.OrganisationSubType
FROM tblOrganisations o LEFT JOIN
     tblOrganisationTypes ot
     ON o.tblOrganisationTypes_ReferenceID = ot.ReferenceID LEFT JOIN
     tblOrganisationSubTypes ost
     ON o.tblOrganisationSubTypes_ReferenceID = ost.ReferenceID )
GROUP BY o.tblOrganisationTypes_ReferenceID, 
         o.tblOrganisationSubTypes_ReferenceID
ORDER BY ot.OrganisationType , ost.OrganisationSubType;

你糊涂了。您得到的“10”是 FULL 没有子类型的组织的数量。这不是某种聚合。如果您想要不同级别的总和,那么一个好的方法是使用 ROLLUP:

GROUP BY o.tblOrganisationTypes_ReferenceID, 
         o.tblOrganisationSubTypes_ReferenceID WITH ROLLUP

这将为 所有 可能的小计(包括整个 table 的总数)生成额外的行。您将需要弄清楚如何过滤结果行以获得您想要的结果。您应该查看有关此功能的 documentation