名称按字母顺序排列,然后按字母顺序排列“排序方式”不起作用

时间:2017-08-07 20:40:05

标签: sql coldfusion

我非常困惑。我以为我按照升序排列了员工姓名,然后将我的位置作为子类别升序。但即使我的同名也不按字母顺序排列。

<cfset date1 = CREATEODBCDATETIME(form.StartDate & '00:00:00')>
<cfset date2 = CREATEODBCDATETIME(form.EndDate & '23:59:59')>

<cfquery datasource="#application.dsn#" name="GetEmployeeInfo">
    SELECT  trans_location, date, associate
    FROM    cl_checklists
    WHERE   date >=  <cfqueryparam value="#date1#" cfsqltype="cf_sql_timestamp" />
            AND date <= <cfqueryparam value="#date2#" cfsqltype="cf_sql_timestamp" />
            AND trans_location IN ( <cfqueryparam value="#FORM.location#" cfsqltype="cf_sql_varchar" list="true" />  )
            AND associate IN ( <cfqueryparam value="#FORM.EmployeeName#" cfsqltype="cf_sql_varchar" list="true" />  )
</cfquery>

<cfquery datasource="#application.dsn#" name="GetLocationInfo">
    SELECT  trans_location, date, associate
    FROM    cl_checklists
    WHERE   date >=  <cfqueryparam value="#date1#" cfsqltype="cf_sql_timestamp" />
            AND date <= <cfqueryparam value="#date2#" cfsqltype="cf_sql_timestamp" />
            AND trans_location IN ( <cfqueryparam value="#FORM.location#" cfsqltype="cf_sql_varchar" list="true" />  )
</cfquery>

 <cffunction name="getop_id" access="public" returntype="string"> 
    <cfargument name="associate"  > 
    <cfquery name="spitOutop_id" datasource="#application.userinfo_dsn#"> 
        SELECT assoc_name 
        FROM dbo.tco_associates 
        WHERE assoc_id= #arguments.associate# 
    </cfquery> 
    <cfreturn spitOutop_id.assoc_name > 
 </cffunction> 

 <cfquery name="allAssociatesQry" dbtype="query">
    SELECT DISTINCT associate, COUNT(*) AS associateCount FROM GetEmployeeInfo GROUP BY associate ORDER BY associate 
 </cfquery>

<table border="1" id="Checklist_Stats">
    <thead>
        <th><strong>Associate Name</strong></th>
        <th><strong>Location</strong></th>
        <th><strong>Checklists Generated by Associate</strong></th>
        <th><strong>Checklists Generated by Selected Location(s)</strong></th>
        <th><strong>Associate Percentage of Location Total</strong></th>   
    </thead>
    <tbody>
      <!--- aggregate variables --->
      <cfset aggrAssociateChecklist = 0>
      <cfset aggrLocationChecklist = 0>

      <cfloop query="allAssociatesQry">
          <!--- get Associate's name --->
          <cfset thisAssociateCode = trim(allAssociatesQry.associate)>
          <cfset thisAssociateName = getop_id(thisAssociateCode) />
          <!--- 1.1 get all trans_location code and total counts for the current Associate --->
          <cfquery name="allLocCodeForAssociateQry" dbtype="query">
              SELECT trans_location,count(trans_location) AS locCntr FROM GetEmployeeInfo WHERE associate='#thisAssociateCode#' GROUP BY trans_location ORDER BY trans_location
          </cfquery>
          <!--- 1.2 get the aggregate of checklist count generated by the current Associate for each location --->
          <cfquery name="qTotalChecklistCountForAssociate" dbtype="query">
              SELECT SUM(locCntr) AS totalAssocChecklist FROM allLocCodeForAssociateQry 
          </cfquery>

          <!--- 2.1 get the total location checklist for each location available for the current Associate --->
          <cfquery name="allLocChecklistForAssociateQry" dbtype="query">
              SELECT trans_location,count(trans_location) AS totalLocCount FROM GetLocationInfo WHERE trans_location IN (#QuotedValueList(allLocCodeForAssociateQry.trans_location)#) GROUP BY trans_location ORDER BY trans_location
          </cfquery>
          <!--- 2.2 get the aggregate of location checklist generated by the current Associate --->
          <cfquery name="qTotalLocChecklistForAssociate" dbtype="query">
              SELECT SUM(totalLocCount) AS totalLocChecklist FROM allLocChecklistForAssociateQry
          </cfquery>
          <!--- display record for the current Associate --->
            <cfoutput query="allLocCodeForAssociateQry">
              <tr>
                  <!---<td><strong>#thisAssociateCode#</strong></td>--->
                  <td><strong>#thisAssociateName#</strong></td>
                  <td>#allLocCodeForAssociateQry.trans_location#</td>
                  <td>#allLocCodeForAssociateQry.locCntr#</td>
                  <td>#allLocChecklistForAssociateQry['totalLocCount'][CurrentRow]#</td>
                  <td>#NumberFormat((allLocCodeForAssociateQry.locCntr/allLocChecklistForAssociateQry['totalLocCount'][CurrentRow]) * 100, '9.99')#%</td>
              </tr>
              <cfset thisAssociateName = "" />
            </cfoutput>
            <!--- 3.1 get sub total for each Associate group --->
            <cfset totalAssocChecklist = qTotalChecklistCountForAssociate.totalAssocChecklist>
            <cfset totalLocChecklist = qTotalLocChecklistForAssociate.totalLocChecklist>
            <!--- 3.2 add to the aggregate --->
            <cfset aggrAssociateChecklist += totalAssocChecklist>
            <cfset aggrLocationChecklist += totalLocChecklist>
            <!--- display sub total for each Associate group --->
            <cfoutput>
                <tr>
                    <td>Associate Total</td>
                    <td></td>
                    <td>#totalAssocChecklist#</td>
                    <td>#totalLocChecklist#</td>
                    <td>#NumberFormat((totalAssocChecklist/totalLocChecklist) * 100, '9.99')#%</td>
                </tr>
            </cfoutput>
      </cfloop>
</tbody>
</table>

有人请告诉我为什么不按字母顺序列出员工姓名,然后在员工姓名整理后按顺序列出姓名?

我以为ORDER BY associate正在这样做,但名字完全分散了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

问题:

看起来allAssociatesQry查询按关联代码排序,而不是关联名称:

SELECT DISTINCT associate, COUNT(*) AS associateCount FROM GetEmployeeInfo GROUP BY associate ORDER BY associate

然后你这样做:

<cfset thisAssociateCode = trim(allAssociatesQry.associate)>

似乎关联代码不一定按名称顺序排列?

建议的解决方案:

使用allAssociatesQryJOIN更改为tco_associates,然后将ORDER BY更改为关联名称:

SELECT DISTINCT gei.associate, a.assoc_name, COUNT(*) AS associateCount FROM GetEmployeeInfo gei JOIN tco_associates a ON gei.associate = a.assoc_id GROUP BY gei.associate, a.assoc_name ORDER BY a.associateName

答案 1 :(得分:1)

这应该按照您想要的顺序为您提供。

<cfquery datasource="#application.dsn#" name="GetEmployeeInfo">
    SELECT ltrim(rtrim(c.associate)) AS thisAssociateCode  --<< GetEmployeeInfo
        , a.assoc_name AS thisAssociateName --<< getop_id.assoc_name
        , c.trans_location --<< GetEmployeeInfo
        , c.[date] --<< GetEmployeeInfo
    FROM    cl_checklists c
    INNER JOIN dbo.tco_associates a ON c.associate = a.assoc_id
    WHERE   c.[date] >=  <cfqueryparam value="#date1#" cfsqltype="cf_sql_timestamp" />
            AND c.[date] <= <cfqueryparam value="#date2#" cfsqltype="cf_sql_timestamp" />
            AND c.trans_location IN ( <cfqueryparam value="#FORM.location#" cfsqltype="cf_sql_varchar" list="true" />  )
            AND c.associate IN ( <cfqueryparam value="#FORM.EmployeeName#" cfsqltype="cf_sql_varchar" list="true" />  )
    ORDER BY a.assoc_name
</cfquery>     

它还允许您删除getop_id函数。

你可以摆脱:

<cfset thisAssociateCode = trim(allAssociatesQry.associate)>
<cfset thisAssociateName = getop_id(thisAssociateCode) />
相关问题