2016-04-02 57 views
1

请参阅以下第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> 

Get me this;

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!对于没有子类型的类型,计数是正确的。子类型计数是正确的。我已经试过各种但我没有在任何地方得到:(

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

1日编辑

在从@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) 

我敢肯定,有可能是一个更清洁的方式来做到这一点,如果有人知道它我打开的建议,但现在 - 这是工作:)

回答

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

+0

感谢您的帮助,我从来没有听说过WITH ROLLUP - 所以我会研究它。我尝试了WITH ROLLUP,但我得到了一个错误 - “错误执行数据库查询。错误的使用CUBE/ROLLUP和ORDER BY”但我发现如果我删除了ORDER BY的东西,它的工作原理 - 计数都很好:) – luke

+0

ahhhh ...从该链接到文档; '使用ROLLUP时,不能使用ORDER BY子句对结果进行排序。换句话说,ROLLUP和ORDER BY是互斥的。 ' – luke

+0

对不起,我错了:(计数是不正确的 - 我越来越; ASSOCIATE(15) 全部(108) - 所有者(108) - 运营商(10) - 制造商(4) - 系统供应商(4) - 调查公司(4) 政府(5) 科学(4) AFFILIATED(2) 杂项(3) – luke