2016-04-02 29 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