代码之家  ›  专栏  ›  技术社区  ›  Samuel Rayanne

尽量避免SQL Server查询中的联合

  •  -4
  • Samuel Rayanne  · 技术社区  · 7 年前

    我有一个为呼叫中心收集不同指标的查询:

        SELECT      CONCAT (DEPARTMENT_DESC, 'Week', datepart(wk, ROW_DATE)) As Dept_Date,
                datepart(wk, ROW_DATE) as weeknum,
                DEPARTMENT_DESC AS DEPT,
                SUM([CALLS_OFFERED_ACTUALS]) As LCW_Calls_Offered,
                MAX(LCW) AS LCW,
                (SUM(ANSTIME) / SUM(CALLS_ANSWERED_ACTUALS)) AS ASA,
                SUM(HANDLED_TIME) / SUM(CALLS_ANSWERED_ACTUALS) AS AHT,
                SUM(HANDLED_TIME) as handletime,
                SUM(CALLS_OFFERED_FCST) AS Call_Target,
                SUM(CALLS_ANSWERED_ACTUALS) as call_answered,
                CAST(1.000*(SUM(TRANSFERS)+SUM(CONFERENCE)) / SUM(CALLS_ANSWERED_ACTUALS) AS DECIMAL(19,3)) AS Transf_Rate,
                CAST(1.000*(SUM(CALLS_ABD_ACTUALS)) / SUM([CALLS_OFFERED_ACTUALS]) AS DECIMAL(19,3)) AS Abandon_Rate,
                1-CAST(1.000*(SUM(LCW60)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT,
                CAST(1.000*(SUM(ONLINETIME)-SUM(AVAILTIME)-SUM(ALARMTIME))/SUM(ONLINETIME)  AS DECIMAL(19,3)) AS Occupancy,
                CAST(1.000*(SUM(PRODTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Productivity,
                CAST(1.000*(SUM(AVAILTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Availab,
                CAST(1.000*(SUM(OVERTIME)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Overtime,
                CAST(1.000*(SUM(UNPROD_TIME_UNPLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Unplanned_Shrink,
                CAST(1.000*(SUM(UNPROD_TIME_PLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Planned_Shrink,
                CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS SL_Within_20,
                CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)+SUM(CALLS_ANSWERED_INT3)+SUM(CALLS_ANSWERED_INT4)+SUM(CALLS_ANSWERED_INT5)+SUM(CALLS_ANSWERED_INT6)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS Calls_Within_60,
                1-CAST(1.000*(SUM(LCW300)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT1,
                1-CAST(1.000*(SUM(LCW120)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT2
          FROM [GEMDB].[dbo].[v_calls_LCW_Splitday]
      where datepart(wk, ROW_DATE) >= (datepart(wk, GETDATE()) - 6) AND datepart(year, ROW_DATE) = 2017
      GROUP BY datepart(wk, ROW_DATE), DEPARTMENT_DESC --((CALLS_ANSWERED_INT1 + CALLS_ANSWERED_INT2) / [CALLS_OFFERED_ACTUALS]) 
      ORDER BY datepart(wk, ROW_DATE
    

    )

    我们决定创建一个名为客户服务的新子部门,该部门由计费和;共同提供技术支持。

    我找到了一种方法,通过对另一个查询进行联合,该查询只选择用于计费的数据;技术支持。

    /****** Script for SelectTopNRows command from SSMS  ******/
    
    
    SELECT      CONCAT ('CS', 'Week', datepart(wk, ROW_DATE)) As Dept_Date,
                datepart(wk, ROW_DATE) as weeknum,
                CONCAT('CS','DEPT') AS DEPT,
                SUM([CALLS_OFFERED_ACTUALS]) As LCW_Calls_Offered,
                MAX(LCW) AS LCW,
                (SUM(ANSTIME) / SUM(CALLS_ANSWERED_ACTUALS)) AS ASA,
                SUM(HANDLED_TIME) / SUM(CALLS_ANSWERED_ACTUALS) AS AHT,
                SUM(HANDLED_TIME) as handletime,
                SUM(CALLS_OFFERED_FCST) AS Call_Target,
                SUM(CALLS_ANSWERED_ACTUALS) as call_answered,
                CAST(1.000*(SUM(TRANSFERS)+SUM(CONFERENCE)) / SUM(CALLS_ANSWERED_ACTUALS) AS DECIMAL(19,3)) AS Transf_Rate,
                CAST(1.000*(SUM(CALLS_ABD_ACTUALS)) / SUM([CALLS_OFFERED_ACTUALS]) AS DECIMAL(19,3)) AS Abandon_Rate,
                1-CAST(1.000*(SUM(LCW60)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT,
                CAST(1.000*(SUM(ONLINETIME)-SUM(AVAILTIME)-SUM(ALARMTIME))/SUM(ONLINETIME)  AS DECIMAL(19,3)) AS Occupancy,
                CAST(1.000*(SUM(PRODTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Productivity,
                CAST(1.000*(SUM(AVAILTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Availab,
                CAST(1.000*(SUM(OVERTIME)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Overtime,
                CAST(1.000*(SUM(UNPROD_TIME_UNPLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Unplanned_Shrink,
                CAST(1.000*(SUM(UNPROD_TIME_PLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Planned_Shrink,
                CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS SL_Within_20,
                CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)+SUM(CALLS_ANSWERED_INT3)+SUM(CALLS_ANSWERED_INT4)+SUM(CALLS_ANSWERED_INT5)+SUM(CALLS_ANSWERED_INT6)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS Calls_Within_60,
                1-CAST(1.000*(SUM(LCW300)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT1,
                1-CAST(1.000*(SUM(LCW120)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT2
            INTO #TEMP_CS   
        FROM [GEMDB].[dbo].[v_calls_LCW_Splitday]
      where datepart(wk, ROW_DATE) >= (datepart(wk, GETDATE()) - 6) AND datepart(year, ROW_DATE) = 2017
      AND DEPARTMENT_DESC IN ('BILLING', 'TechOps')
       GROUP BY datepart(wk, ROW_DATE) --((CALLS_ANSWERED_INT1 + CALLS_ANSWERED_INT2) / [CALLS_OFFERED_ACTUALS]) 
      ORDER BY datepart(wk, ROW_DATE)
    
    
      SELECT        CONCAT (DEPARTMENT_DESC, 'Week', datepart(wk, ROW_DATE)) As Dept_Date,
                datepart(wk, ROW_DATE) as weeknum,
                DEPARTMENT_DESC AS DEPT,
                SUM([CALLS_OFFERED_ACTUALS]) As LCW_Calls_Offered,
                MAX(LCW) AS LCW,
                (SUM(ANSTIME) / SUM(CALLS_ANSWERED_ACTUALS)) AS ASA,
                SUM(HANDLED_TIME) / SUM(CALLS_ANSWERED_ACTUALS) AS AHT,
                SUM(HANDLED_TIME) as handletime,
                SUM(CALLS_OFFERED_FCST) AS Call_Target,
                SUM(CALLS_ANSWERED_ACTUALS) as call_answered,
                CAST(1.000*(SUM(TRANSFERS)+SUM(CONFERENCE)) / SUM(CALLS_ANSWERED_ACTUALS) AS DECIMAL(19,3)) AS Transf_Rate,
                CAST(1.000*(SUM(CALLS_ABD_ACTUALS)) / SUM([CALLS_OFFERED_ACTUALS]) AS DECIMAL(19,3)) AS Abandon_Rate,
                1-CAST(1.000*(SUM(LCW60)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT,
                CAST(1.000*(SUM(ONLINETIME)-SUM(AVAILTIME)-SUM(ALARMTIME))/SUM(ONLINETIME)  AS DECIMAL(19,3)) AS Occupancy,
                CAST(1.000*(SUM(PRODTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Productivity,
                CAST(1.000*(SUM(AVAILTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Availab,
                CAST(1.000*(SUM(OVERTIME)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Overtime,
                CAST(1.000*(SUM(UNPROD_TIME_UNPLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Unplanned_Shrink,
                CAST(1.000*(SUM(UNPROD_TIME_PLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Planned_Shrink,
                CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS SL_Within_20,
                CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)+SUM(CALLS_ANSWERED_INT3)+SUM(CALLS_ANSWERED_INT4)+SUM(CALLS_ANSWERED_INT5)+SUM(CALLS_ANSWERED_INT6)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS Calls_Within_60,
                1-CAST(1.000*(SUM(LCW300)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT1,
                1-CAST(1.000*(SUM(LCW120)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT2
                INTO #TEMP_ALL
       FROM [GEMDB].[dbo].[v_calls_LCW_Splitday]
      where datepart(wk, ROW_DATE) >= (datepart(wk, GETDATE()) - 6) AND datepart(year, ROW_DATE) = 2017
       GROUP BY datepart(wk, ROW_DATE), DEPARTMENT_DESC --((CALLS_ANSWERED_INT1 + CALLS_ANSWERED_INT2) / [CALLS_OFFERED_ACTUALS]) 
         ORDER BY datepart(wk, ROW_DATE)
    
    
      SELECT *
      FROM #TEMP_ALL
      UNION
      SELECT *
      FROM #TEMP_CS
    
      DROP TABLE #TEMP_ALL
      DROP TABLE #TEMP_CS
    

    有没有更有效的方法来实现这一点?我们不能等待3分钟以上才能完成此查询。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   xQbert    7 年前
    • 不知道你为什么需要临时表格
    • 不确定为什么需要使用union vs union all
    • case when DEPARTMENT_DESC in IN ('BILLING', 'TechOps') then 'Customer Service' else DEPARTMENT_DESC end .

    保留union,但使用union all并避免临时表。

    /****** Script for SelectTopNRows command from SSMS  ******/
    SELECT CONCAT ('CS', 'Week', datepart(wk, ROW_DATE)) As Dept_Date
         , datepart(wk, ROW_DATE) as weeknum
         , CONCAT('CS','DEPT') AS DEPT
         , SUM([CALLS_OFFERED_ACTUALS]) As LCW_Calls_Offered
         , MAX(LCW) AS LCW
         , SUM(ANSTIME) / SUM(CALLS_ANSWERED_ACTUALS) AS ASA
         , SUM(HANDLED_TIME) / SUM(CALLS_ANSWERED_ACTUALS) AS AHT
         , SUM(HANDLED_TIME) as handletime
         , SUM(CALLS_OFFERED_FCST) AS Call_Target
         , SUM(CALLS_ANSWERED_ACTUALS) as call_answered
         , CAST(1.000*(SUM(TRANSFERS)+SUM(CONFERENCE)) / SUM(CALLS_ANSWERED_ACTUALS) AS DECIMAL(19,3)) AS Transf_Rate
         , CAST(1.000*(SUM(CALLS_ABD_ACTUALS)) / SUM([CALLS_OFFERED_ACTUALS]) AS DECIMAL(19,3)) AS Abandon_Rate
         , 1-CAST(1.000*(SUM(LCW60)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT
         , CAST(1.000*(SUM(ONLINETIME)-SUM(AVAILTIME)-
         , SUM(ALARMTIME))/SUM(ONLINETIME)  AS DECIMAL(19,3)) AS Occupancy
         , CAST(1.000*(SUM(PRODTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Productivity
         , CAST(1.000*(SUM(AVAILTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Availab
         , CAST(1.000*(SUM(OVERTIME)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Overtime
         , CAST(1.000*(SUM(UNPROD_TIME_UNPLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Unplanned_Shrink
         , CAST(1.000*(SUM(UNPROD_TIME_PLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Planned_Shrink
         , CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS SL_Within_20
         , CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)+SUM(CALLS_ANSWERED_INT3)+SUM(CALLS_ANSWERED_INT4)+SUM(CALLS_ANSWERED_INT5)+SUM(CALLS_ANSWERED_INT6)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS Calls_Within_60
         , 1-CAST(1.000*(SUM(LCW300)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT1
         , 1-CAST(1.000*(SUM(LCW120)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT2
    FROM [GEMDB].[dbo].[v_calls_LCW_Splitday]
    WHERE  datepart(wk, ROW_DATE) >= (datepart(wk, GETDATE()) - 6) 
      AND datepart(year, ROW_DATE) = 2017
      AND DEPARTMENT_DESC IN ('BILLING', 'TechOps')
    GROUP BY datepart(wk, ROW_DATE) --((CALLS_ANSWERED_INT1 + CALLS_ANSWERED_INT2) / [CALLS_OFFERED_ACTUALS]) 
    ORDER BY datepart(wk, ROW_DATE)
    
    UNION ALL
    
    SELECT CONCAT (DEPARTMENT_DESC, 'Week', datepart(wk, ROW_DATE)) As Dept_Date
         , datepart(wk, ROW_DATE) as weeknum
         , DEPARTMENT_DESC AS DEPT
         , SUM([CALLS_OFFERED_ACTUALS]) As LCW_Calls_Offered
         , MAX(LCW) AS LCW
         , SUM(ANSTIME) / SUM(CALLS_ANSWERED_ACTUALS) AS ASA
         , SUM(HANDLED_TIME) / SUM(CALLS_ANSWERED_ACTUALS) AS AHT
         , SUM(HANDLED_TIME) as handletime
         , SUM(CALLS_OFFERED_FCST) AS Call_Target
         , SUM(CALLS_ANSWERED_ACTUALS) as call_answered
         , CAST(1.000*(SUM(TRANSFERS)+SUM(CONFERENCE)) / SUM(CALLS_ANSWERED_ACTUALS) AS DECIMAL(19,3)) AS Transf_Rate
         , CAST(1.000*(SUM(CALLS_ABD_ACTUALS)) / SUM([CALLS_OFFERED_ACTUALS]) AS DECIMAL(19,3)) AS Abandon_Rate
         , 1-CAST(1.000*(SUM(LCW60)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT
         , CAST(1.000*(SUM(ONLINETIME)-SUM(AVAILTIME)-SUM(ALARMTIME))/SUM(ONLINETIME)  AS DECIMAL(19,3)) AS Occupancy
         , CAST(1.000*(SUM(PRODTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Productivity
         , CAST(1.000*(SUM(AVAILTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Availab
         , CAST(1.000*(SUM(OVERTIME)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Overtime
         , CAST(1.000*(SUM(UNPROD_TIME_UNPLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Unplanned_Shrink
         , CAST(1.000*(SUM(UNPROD_TIME_PLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Planned_Shrink
         , CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS SL_Within_20
         , CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)+SUM(CALLS_ANSWERED_INT3)+SUM(CALLS_ANSWERED_INT4)+SUM(CALLS_ANSWERED_INT5)+SUM(CALLS_ANSWERED_INT6)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS Calls_Within_60
         , 1-CAST(1.000*(SUM(LCW300)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT1
         , 1-CAST(1.000*(SUM(LCW120)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT2
    
    FROM [GEMDB].[dbo].[v_calls_LCW_Splitday]
    WHERE datepart(wk, ROW_DATE) >= (datepart(wk, GETDATE()) - 6) 
      AND datepart(year, ROW_DATE) = 2017
    GROUP BY datepart(wk, ROW_DATE)
           , DEPARTMENT_DESC --((CALLS_ANSWERED_INT1 + CALLS_ANSWERED_INT2) / [CALLS_OFFERED_ACTUALS]) 
    ORDER BY datepart(wk, ROW_DATE)
    

    case when DEPARTMENT_DESC in IN ('BILLING', 'TechOps')  
                    then 'Customer Service' 
                    else DEPARTMENT_DESC end
    

    所以我接受了你的第一个问题,就这么做了。

    SELECT CONCAT(case when DEPARTMENT_DESC in IN ('BILLING', 'TechOps')  
                       then 'Customer Service' 
                       else DEPARTMENT_DESC end
                  , 'Week', datepart(wk, ROW_DATE)) As Dept_Date
         , datepart(wk, ROW_DATE) as weeknum
         , case when DEPARTMENT_DESC in IN ('BILLING', 'TechOps')  
                then 'Customer Service' 
                else DEPARTMENT_DESC end AS DEPT
         , SUM([CALLS_OFFERED_ACTUALS]) As LCW_Calls_Offered
         , MAX(LCW) AS LCW
         , SUM(ANSTIME) / SUM(CALLS_ANSWERED_ACTUALS) AS ASA
         , SUM(HANDLED_TIME) / SUM(CALLS_ANSWERED_ACTUALS) AS AHT
         , SUM(HANDLED_TIME) as handletime
         , SUM(CALLS_OFFERED_FCST) AS Call_Target
         , SUM(CALLS_ANSWERED_ACTUALS) as call_answered
         , CAST(1.000*(SUM(TRANSFERS)+SUM(CONFERENCE)) / SUM(CALLS_ANSWERED_ACTUALS) AS DECIMAL(19,3)) AS Transf_Rate
         , CAST(1.000*(SUM(CALLS_ABD_ACTUALS)) / SUM([CALLS_OFFERED_ACTUALS]) AS DECIMAL(19,3)) AS Abandon_Rate
         , 1-CAST(1.000*(SUM(LCW60)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT
         , CAST(1.000*(SUM(ONLINETIME)-SUM(AVAILTIME)-SUM(ALARMTIME))/SUM(ONLINETIME)  AS DECIMAL(19,3)) AS Occupancy
         , CAST(1.000*(SUM(PRODTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Productivity
         , CAST(1.000*(SUM(AVAILTIME)) / SUM(ATWORKTIME) AS DECIMAL(19,3)) AS Availab
         , CAST(1.000*(SUM(OVERTIME)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Overtime
         , CAST(1.000*(SUM(UNPROD_TIME_UNPLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Unplanned_Shrink
         , CAST(1.000*(SUM(UNPROD_TIME_PLANNED)) / SUM(WORKFORCETIME) AS DECIMAL(19,3)) AS Planned_Shrink
         , CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS SL_Within_20
         , CAST(1.000*(SUM(CALLS_ANSWERED_INT1)+SUM(CALLS_ANSWERED_INT2)+SUM(CALLS_ANSWERED_INT3)+SUM(CALLS_ANSWERED_INT4)+SUM(CALLS_ANSWERED_INT5)+SUM(CALLS_ANSWERED_INT6)) / SUM(CALLS_OFFERED_ACTUALS) AS DECIMAL(19,3)) AS Calls_Within_60
         , 1-CAST(1.000*(SUM(LCW300)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT1
         , 1-CAST(1.000*(SUM(LCW120)) / SUM(INT_CNT) AS DECIMAL(19,3)) AS LCW_INT2
    FROM [GEMDB].[dbo].[v_calls_LCW_Splitday]
    WHERE datepart(wk, ROW_DATE) >= (datepart(wk, GETDATE()) - 6) 
      AND datepart(year, ROW_DATE) = 2017
    GROUP BY datepart(wk, ROW_DATE)
           , case when DEPARTMENT_DESC in IN ('BILLING', 'TechOps')  
                  then 'Customer Service' 
                  else DEPARTMENT_DESC end  --((CALLS_ANSWERED_INT1 + CALLS_ANSWERED_INT2) / [CALLS_OFFERED_ACTUALS]) 
    ORDER BY datepart(wk, ROW_DATE