1

在@Gordon Linoff 的回答之后,请参阅下面的第一次编辑

有关第二个编辑/混乱的解决方案,请参见底部

原始问题

我有 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!对于没有 SubType 的类型,计数是正确的。SubTypes 计数是正确的。我已经尝试了各种方法,但我无处可去:(

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

第一次编辑

在@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 的 FULL?!

第二次编辑/混乱的解决方案

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

以下输出代码;

<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)

我确信可能有一种更清洁的方法可以做到这一点,如果有人知道,我愿意接受建议,但现在 - 这是有效的:)

4

1 回答 1

2

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

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

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

于 2016-04-02T13:10:41.753 回答