按多列分组但不使用聚合函数或使用cfoutput/cfloop的组?
我仍然在学习如何从查询中获得我想要的结果。我在网上查了几十个例子,但没有一个完全符合我的需求。我正在寻找一种最直接的方法,即从表中抽取一组具有特定日期范围的记录,按公司名称对它们进行子过滤,然后按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
你实际上非常接近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订购。
,你可以采取,这将使你类似的结果没有得到过重只是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>
我在过去的分组不实用的地方使用过类似的例子。
我看到你在那里做了什么...一个人为的循环。我相信,我的主要问题是SQL语句。我不理解A)我需要一个'HAVING'子句而不是'WHERE'和B)GROUP BY和ORDER BY都需要我选择的非聚合函数(赦免我的英文)字段,'dos'和'公司'。尽管减轻SQL负载是一个不错的窍门,但我一定会牢记未来。好看,史蒂夫。 – 2013-03-13 15:59:33
感谢Dan,这就是我一直在寻找的...我也发现一些更绝望的谷歌搜索后,我需要一个'HAVING'而不是'WHERE'在SQL中。我想我是误解,认为只有顶级父母可能有一个组,显然情况正好相反,只有底层的子标签不能有一个组...我欣赏它,丹! :) –
2013-03-13 16:03:10