我仍在学习如何以我想要的方式从查询中获取我的结果组。我在网上查看了许多示例,但没有一个完全符合我的需求。我正在寻找从表中提取具有特定日期范围的一组记录的最直接方法,按公司名称对其进行子过滤,然后按 test_type 字段的计数对这些进行子过滤。它需要是动态的(测试类型是非动态的;这些是设置的并且不会改变),因为公司的数量在不断增长。这个问题与我一个月前在这里发布的另一个问题非常相似,只是现在我需要进一步(超级?)按服务日期(字段名称“dos”)过滤我的结果。这是我目前的代码(不工作;带有“donor_log.company”的错误
<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 日。我已经在另一个页面上放置了代码,我可以重用这些代码以允许根据最终用户的偏好进行动态日期选择,因此三月日期是任意的。我应该在这里使用子查询吗?以不同的方式/排列使用 cfoutput/cfloop?一如既往地期待您的回复和提前致谢!:)
PS:使用 ColdFusion 8 和 SQL Server 2005。