我正在运行以下查询和QoQ。你能告诉我如何进行“下载CSV”文件选项吗?
<!--- QoQ for FIRSTCONN --->
<cfquery datasource = "XX.XX.X.XX" name="master1">
SELECT STR_TO_DATE(date_format(Timedetail,'%m-%d-%Y'),'%m-%d-%Y') as FIRSTCONN
, COUNT(Timedetail) as FIRSTOccurances
, EVENTS
FROM MyDatabase
WHERE EVENTS = "FIRST"
GROUP BY FIRSTCONN ;
</cfquery>
<!--- Detail Query --->
<cfquery dbtype="query" name="detail1">
SELECT *
FROM master1
WHERE FIRSTCONN >= <cfqueryparam value="#form.startdate#" cfsqltype="cf_sql_varchar">
AND FIRSTCONN < <cfqueryparam value="#dateAdd('d', 1,form.enddate)#" cfsqltype="cf_sql_varchar">;
</cfquery>
<!--- QoQ for SECONDCONN --->
<cfquery datasource = "XX.XX.X.XX" name="master2">
SELECT STR_TO_DATE(date_format(Timedetail,'%m-%d-%Y'),'%m-%d-%Y') as SECONDCONN
, COUNT(Timedetail) as SECONDOccurances
, EVENTS
FROM MyDatabase
WHERE EVENTS = "SECOND"
GROUP BY SECONDCONN ;
</cfquery>
<cfquery dbtype="query" name="detail2">
SELECT *
FROM master2
WHERE SECONDCONN >= <cfqueryparam value="#form.startdate#" cfsqltype="cf_sql_varchar">
AND SECONDCONN < <cfqueryparam value="#dateAdd('d', 1,form.enddate)#" cfsqltype="cf_sql_varchar">;
</cfquery>
<cfchart format="flash" chartwidth="1000" chartheight="500" scalefrom="0" scaleto="50000" xAxisTitle="Dates" yaxistitle="Number of Connections">
<cfchartseries query="detail1" type="line" itemColumn="FIRSTCONN" valueColumn="FIRSTOccurances" >
<cfchartseries query="detail2" type="line" itemColumn="SECONDCONN" valueColumn="SECONDOccurances" >
</cfchartseries>
</cfchart>[/CODE]
The cfform code and cfscript code I'm using is as follows:
[CODE]<cfform format="flash" preloader ="false">
<cfformgroup type="horizontal">
<cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#form.startdate#">
<cfinput type="dateField" name="enddate" label="End Date" width="100" value="#form.enddate#">
<cfinput name="submitApply" type="submit" value = "Apply">
<cfinput name="cancel" type="submit" value="Download CSV">
</cfformgroup>
<cfscript>
var tl ='';
var nl = (Chr( 13 ) & Chr( 10 ));
var fileContent = createObject("java","java.lang.StringBuffer").init();
var counter =1;
fileContent.append( 'FIRST');
fileContent.append(nl);
for(i=1;i<=detail1.recordCount;i=i+1){
tl = detail1.FIRST;
fileContent.append(tl);
fileContent.append(nl);
}
fileContent.append( 'SECOND');
fileContent.append(nl);
for(i=1;i<=detail2.recordCount;i=i+1){
tl = detail2.SECOND;
fileContent.append(tl);
fileContent.append(nl);
}
</cfscript>
<cfset absoluteFilePathAndName = " C:\ColdFusion8\runtime\servers\coldfusion\SERVER-INF\temp\wwwroot-tmp\">
<cfset realtiveFilePathAndName = " C:\ColdFusion8\runtime\servers\coldfusion\SERVER-INF\temp\wwwroot-tmp\">
<cffile action="write" file="#absoluteFilePathAndName#" output="#fileContent.toString()#"/>
<a href="#realtiveFilePathAndName#>Download</a>
期望的输出:
我已为下面的输出附加了。请附上。
基本上,如果日期范围是6月21日至7月21日。输出必须如图所示。 (为了简化我的代码,我省略了THIRDCONN等。)
我试图尝试上述问题,我是否需要为每一列编写fileContent.append()?如果我错了,请告诉我。
P.S。我是CF的新手,之前没有这样做过。
由于
答案 0 :(得分:0)
使用单独的查询会使这个问题变得非常困难。要使其正常工作,您基本上需要pivot或将每个查询的行转置到单独的列中。这不是一件容易的事,除非所有的查询都保证以相同的顺序包含完全相同的日期(不太可能)。
如果您有一定数量的事件,那么使用单个数据库查询生成所有计数就更容易 。使用CASE
语句根据“事件”值构建计数:
(注意: 不能 在QoQ内完成。他们不支持CASE
)。
SELECT STR_TO_DATE(date_format(Timedetail,'%m-%d-%Y'),'%m-%d-%Y') as TheDate
, SUM( CASE WHEN EVENTS = 'First' THEN 1 ELSE 0 END ) AS FirstConn
, SUM( CASE WHEN EVENTS = 'Second' THEN 1 ELSE 0 END ) AS SecondConn
, SUM( CASE WHEN EVENTS = 'Third' THEN 1 ELSE 0 END ) AS ThirdConn
FROM YourTableName
WHERE Timedetail >= <cfqueryparam value="#form.startdate#" cfsqltype="cf_sql_date">
AND Timedetail < <cfqueryparam value="#dateAdd('d', 1,form.enddate)#" cfsqltype="cf_sql_date">
GROUP BY STR_TO_DATE(date_format(Timedetail,'%m-%d-%Y'),'%m-%d-%Y')
在单个查询中获得所有结果后,您可以自行完成其余的工作。正如亚当提到的,只需搜索对csv的ColdFusion查询。您可以遵循吨示例,以及一些用于将查询转换为CSV的预构建函数: