检索项目类型、它们的子类型以及这些类型和子类型的计数
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。
根据@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。