根据@Gordon Linoff
的回答,请参阅下面的第一次编辑请参阅第二页编辑/杂乱解决方案的底部
原始问题
我有3张桌子;
tblOrganisations
tblOrganisationTypes
tblOrganisationSubTypes
组织可以拥有Type,某些Types可以拥有SubType
我试图获取类型和子类型的列表和计数,但是我遇到类型具有子类型的计数有问题。
以下查询和代码;
<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?
第二次编辑/混乱解决方案
所以我想这是一个有点混乱的解决方案,但它确实有效!
以下输出代码;
<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)
我确定可能有更简洁的方法来做到这一点,如果有人知道,我可以接受建议,但是现在 - 这是有效的:)
答案 0 :(得分: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
这将为所有可能的小计(包括整个表的总计)产生额外的行。您需要弄清楚如何过滤生成的行以获得您想要的内容。您应该查看此功能的documentation。