2013-03-12 58 views
0

我仍然在學習如何從查詢中獲得我想要的結果。我在網上查了幾十個例子,但沒有一個完全符合我的需求。我正在尋找一種最直接的方法,即從表中抽取一組具有特定日期範圍的記錄,按公司名稱對它們進行子過濾,然後按test_type字段的計數對子過濾。它需要是動態的(在測試類型上是非動態的;這些是已設置的且不會改變的),因爲公司的數量在不斷增長。這個問題與我在一個月前發佈的另一個問題非常相似,只是現在我需要進一步(超級?)根據服務日期(字段名'dos')過濾我的結果。這是我本次代碼(非工作,因爲它不是在聚合函數或GROUP BY子句中包含錯誤出W /「donor_log.company」在選擇列表中無效「。)按多列分組但不使用聚合函數或使用cfoutput/cfloop的組?

<cfquery name="invall" datasource="test"> 
SELECT company,dos, SUM(CASE WHEN test_type = 'UA' THEN 1 ELSE 0 END) AS UACount, 
    SUM(CASE WHEN test_type = 'BA' THEN 1 ELSE 0 END) AS BACount, 
    SUM(CASE WHEN test_type = 'Hair' THEN 1 ELSE 0 END) AS HairCount, 
    SUM(CASE WHEN test_type = 'Bld' THEN 1 ELSE 0 END) AS BldCount, 
    SUM(CASE WHEN test_type = 'DNA' THEN 1 ELSE 0 END) AS DNACount, 
    SUM(CASE WHEN test_type = 'Pat' THEN 1 ELSE 0 END) AS PatCount, 
    SUM(CASE WHEN test_type = 'Phys' THEN 1 ELSE 0 END) AS PhysCount, 
    SUM(CASE WHEN test_type = 'Obs' THEN 1 ELSE 0 END) AS ObsCount 
FROM donor_log 
    WHERE dos BETWEEN '2013-03-01' AND '2013-03-13' 
    GROUP BY dos 
    ORDER BY dos DESC 
</cfquery> 

<table border="1"> 
<tr> 

    <th>Company</th> 
    <th>UA</th> 
    <th>Obs. UA</th> 
    <th>BA</th> 
    <th>Hair</th> 
    <th>Blood</th> 
    <th>DNA</th> 
    <th>Pat.</th> 
    <th>Phys.</th> 
</tr> 
<cfoutput query="invall" group="dos"> 
    #dateformat(invall.dos,"mm-dd-yyyy")# 
<tr> 

    <td>#invall.company#</td> 
    <td>#invall.UACount#</td> 
    <td>#invall.ObsCount#</td> 
    <td>#invall.BACount#</td> 
    <td>#invall.HairCount#</td> 
    <td>#invall.BldCount#</td> 
    <td>#invall.DNACount#</td> 
    <td>#invall.PatCount#</td> 
    <td>#invall.PhysCount#</td> 
</tr> 
</cfoutput> 
</table> 

。我知道它不是由公司過濾,因爲它不喜歡select語句中的兩個非聚合列,但我想知道如何改變它以獲取類似的內容(這個「網頁」將成爲一個發票摘要頁面,用於我們的各種客戶,但我們的參考,而不是實際賬單出來):

03-13-2013 
      UA BA HAIR BLD (ETC...) 
COMPANY A 3  2  0  0 
COMPANY B 1  0  0  0 
COMPANY C 2  4  0  0 

    03-12-2013 
      UA BA HAIR BLD 
COMPANY A 1  0  0  0 
COMPANY C 2  1  1  0 

    03-11-2013 
      UA BA HAIR BLD 
COMPANY B 1  1  1  0 
COMPANY D 4  2  2  1 

...等等,直到2013年3月1日我已經有到位的代碼在不同的頁面,我可以重複使用,以允許基於最終用戶的偏好進行動態日期選擇,所以March日期是任意的。我應該在這裏使用子查詢嗎?以不同的方式/排列使用cfoutput/cfloop?期待您的回覆並提前致謝,一如既往! :)

PS:使用ColdFusion 8和SQL Server 2005

回答

0

你實際上非常接近cfoutput的組屬性。你剛剛沒有完成你的任務。我想你可能想要這樣的東西。

<cfoutput query="invall" group="dos"> 
    output data for this grouping 
    <cfoutput group="company"> 
     output data for this grouping 
     <cfoutput> 
      output ungrouped data 
     </cfoutput> 
    </cfoutput> 
</cfoutput> 

您的查詢必須由dos desc,company訂購。

+0

感謝Dan,這就是我一直在尋找的...我也發現一些更絕望的谷歌搜索後,我需要一個'HAVING'而不是'WHERE'在SQL中。我想我是誤解,認爲只有頂級父母可能有一個組,顯然情況正好相反,只有底層的子標籤不能有一個組...我欣賞它,丹! :) – 2013-03-13 16:03:10

0

,你可以採取,這將使你類似的結果沒有得到過重只是HTML操作的方法是如下:

<cfset variables.lastDate=""> 


<table border="1"> 
<tr> 

    <th>Company</th> 
    <th>UA</th> 
    <th>Obs. UA</th> 
    <th>BA</th> 
    <th>Hair</th> 
    <th>Blood</th> 
    <th>DNA</th> 
    <th>Pat.</th> 
    <th>Phys.</th> 
</tr> 
<cfoutput query="invall"> 
<cfif not invall.dos is variables.lastdate> 
    <tr><td colspan=9>#dateformat(invall.dos,"mm-dd-yyyy")#</td></tr> 
</cfif> 
<tr> 

    <td>#invall.company#</td> 
    <td>#invall.UACount#</td> 
    <td>#invall.ObsCount#</td> 
    <td>#invall.BACount#</td> 
    <td>#invall.HairCount#</td> 
    <td>#invall.BldCount#</td> 
    <td>#invall.DNACount#</td> 
    <td>#invall.PatCount#</td> 
    <td>#invall.PhysCount#</td> 
</tr> 
<Cfset variables.lastdate=invall.dos> 
</cfoutput> 
</table> 

我在過去的分組不實用的地方使用過類似的例子。

+0

我看到你在那裏做了什麼...一個人爲的循環。我相信,我的主要問題是SQL語句。我不理解A)我需要一個'HAVING'子句而不是'WHERE'和B)GROUP BY和ORDER BY都需要我選擇的非聚合函數(赦免我的英文)字段,'dos'和'公司'。儘管減輕SQL負載是一個不錯的竅門,但我一定會牢記未來。好看,史蒂夫。 – 2013-03-13 15:59:33