【问题标题】:Grouping on SQL SERVER avoiding aggregates with fields from a joined table在 SQL SERVER 上进行分组,避免使用连接表中的字段进行聚合
【发布时间】:2015-09-17 08:24:59
【问题描述】:

我有两张桌子: 一个是通话记录列表table1,另一个是预测代理数量列表table2

SELECT 
    datepart(ISOWK, convert(datetime, row_date, 102)) as week,
    MAX(avg_positioned_staff) as aps,
    (fcst01 + fcst02 + fcst03 + fcst04 + fcst05 + fcst06 + fcst07 + fcst08 + fcst09 + fcst10 + fcst11 + fcst12 + fcst13 + fcst14 + fcst15 + fcst16 + fcst17 + fcst18 + fcst19 + fcst20 + fcst21 + fcst22 + fcst23 + fcst24 + fcst25 + fcst26 + fcst27 + fcst28 + fcst29 + fcst30 + fcst31 + fcst32 + fcst33 + fcst34 + fcst35 + fcst36 + fcst37 + fcst38 + fcst39 + fcst40 + fcst41 + fcst42 + fcst43 + fcst44 + fcst45 + fcst46 + fcst47 + fcst48 + fcst49 + fcst50 + fcst51 + cst52 + fcst53 + fcst54 + fcst55 + fcst56 + fcst57 + fcst58 + fcst59 + fcst60 + fcst61 + fcst62 + fcst63 + fcst64 + fcst65 + fcst66) as sfcst,
    SUM(acd_calls) + SUM(aban_calls) as snco,
    SUM(acd_calls) as snch, 
    SUM(acd_calls_60secs) as nchwsl, 
    SUM(aban_calls) as snca,
    SUM(acd_calls) as sans, 
    SUM(aban_calls) as saban,
    SUM(tsa) as sasa,
    SUM(acd_calls) as sacd,
    MAX(max_delay) as mdly,
    SUM(acd_time) as satt,
    SUM(hold_time) as saoht,
    SUM(held_calls) as sheld,
    SUM(acw_time) as sacw,
    SUM(handling_time) saht,
    SUM(acd_calls_60secs) as ssl,
    (SUM(acd_calls) + SUM(aban_calls)) as sAnsAbanSl,
    SUM(handling_time) as socc,
    SUM(avail_time) as savailtym,
    SUM(staffed_time) as sstaffdtym,
    fcst01, fcst02, fcst03, fcst04, fcst05, fcst06, fcst07, fcst08, fcst09, fcst10, fcst11, fcst12, fcst13, fcst14, fcst15, fcst16, fcst17, fcst18, fcst19, fcst20, fcst21, fcst22, fcst23, fcst24, fcst25, fcst26, fcst27, fcst28, fcst29, fcst30, fcst31, fcst32, fcst33, fcst34, fcst35, fcst36, fcst37, fcst38, fcst39, fcst40, fcst41, fcst42, fcst43, fcst44, fcst45, fcst46, fcst47, fcst48, fcst49, fcst50, fcst51, fcst52, fcst53, fcst54, fcst55, fcst56, fcst57, fcst58, fcst59, fcst60, fcst61, fcst62, fcst63, fcst64, fcst65, fcst66

FROM table1
LEFT JOIN table2
    on table1.row_date = table2.date 

GROUP BY
    datepart(ISOWK, convert(datetime, row_date, 102)),
    fcst01, fcst02, fcst03, fcst04, fcst05, fcst06, fcst07, fcst08, fcst09, fcst10, fcst11, fcst12, fcst13, fcst14, fcst15, fcst16, fcst17, fcst18, fcst19, fcst20, fcst21, fcst22, fcst23, fcst24, fcst25, fcst26, fcst27, fcst28, fcst29, fcst30, fcst31, fcst32, fcst33, fcst34, fcst35, fcst36, fcst37, fcst38, fcst39, fcst40, fcst41, fcst42, fcst43, fcst44, fcst45, fcst46, fcst47, fcst48, fcst49, fcst50, fcst51, fcst52, fcst53, fcst54, fcst55, fcst56, fcst57, fcst58, fcst59, fcst60, fcst61, fcst62, fcst63, fcst64, fcst65, fcst66

ORDER BY
    datepart(ISOWK, convert(datetime, row_date, 102))

您可能首先注意到,我有一长串fcst,因为: 表 1 是从系统自动生成的 Table2由用户输入,Table2的表结构为

|日期 | fsct01 | fcst02 ...... fcst0N | -------------------------------------------------- |日期 |整数 |整数 ............. 整数 |

并且每次更新都会垂直填充。

现在,table1 和 table2 的关系就像在 table1 的每条记录中都需要 table2 的列。第 1 行与 fcst01 配对,第 2 行与 fcst02 配对,依此类推,使用密钥 row_date = date。 table1 将在一个日期下有许多行(66 行),而 table2 每个日期只有 1 行。

周aps sfcst ... 27 28 568 ... 27 26 889 ... 28 28 284 ... 28 37 948 ...

我想按week 对它进行分组,但似乎fsct 搞砸了,因为它需要包含在分组中。

我希望它是...

周aps sfcst ... 27 sum(aps) [一周内所有 fcst 的总和] ... 28 sum(aps) [一周内所有 fcst 的总和] ... 29 sum(aps) [一周内所有 fcst 的总和] ... 30 sum(aps) [一周内所有 fcst 的总和] ...

希望我是有道理的, 有什么可能的解决方法?

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    抱歉,您的问题不是很清楚。能否请您通过下面的链接重新发布:

    Short, Self Contained, Correct (Compilable), Example

    为了也给您一些启发,您可以查看选项:

    1. 枢轴
    2. over 和 partition by

    【讨论】:

      【解决方案2】:

      终于找到了正确的逻辑。只需将 table2 分组并将其与 table1 ON table1.week = table2.week 连接即可。

      代码如下:

      SELECT 
          datepart(ISOWK, convert(datetime, row_date, 102)) as week,
          MAX(avg_positioned_staff) as aps,
          (sfcst01+ sfcst02+ sfcst03+ sfcst04+ sfcst05+ sfcst06+ sfcst07+ sfcst08+ sfcst09+ sfcst10+ sfcst11+ sfcst12+ sfcst13+ sfcst14+ sfcst15+ sfcst16+ sfcst17+ sfcst18+ sfcst19+ sfcst20+ sfcst21+ sfcst22+ sfcst23+ sfcst24+ sfcst25+ sfcst26+ sfcst27+ sfcst28+ sfcst29+ sfcst30+ sfcst31+ sfcst32+ sfcst33+ sfcst34+ sfcst35+ sfcst36+ sfcst37+ sfcst38+ sfcst39+ sfcst40+ sfcst41+ sfcst42+ sfcst43+ sfcst44+ sfcst45+ sfcst46+ sfcst47+ sfcst48+ sfcst49+ sfcst50+ sfcst51+ sfcst52+ sfcst53+ sfcst54+ sfcst55+ sfcst56+ sfcst57+ sfcst58+ sfcst59+ sfcst60+ sfcst61+ sfcst62+ sfcst63+ sfcst64+ sfcst65+ sfcst66) as sfcst,
          SUM(acd_calls)+SUM(aban_calls) as snco,
          SUM(acd_calls) as snch,
          SUM(acd_calls_60secs) as nchwsl,
          SUM(aban_calls) as snca,
          SUM(acd_calls) as sans,
          SUM(aban_calls) as saban,
          SUM(tsa) as sasa,
          SUM(acd_calls) as sacd,
          MAX(max_delay) as mdly,
          SUM(acd_time) as satt,
          SUM(hold_time) as saoht,
          SUM(held_calls) as sheld,
          SUM(acw_time) as sacw,
          SUM(handling_time) saht,
          SUM(acd_calls_60secs) as ssl,
          (SUM(acd_calls)+SUM(aban_calls)) as sAnsAbanSl,
          SUM(handling_time) as socc,
          SUM(avail_time) as savailtym,
          SUM(staffed_time) as sstaffdtym
          FROM [AA].[dbo].[history] 
          left join
          ( select datepart(ISOWK, convert(datetime, date, 102) ) as week2, sum(fcst01) as sfcst01 , sum(fcst02) as sfcst02 , sum(fcst03) as sfcst03 , sum(fcst04) as sfcst04 , sum(fcst05) as sfcst05 , sum(fcst06) as sfcst06 , sum(fcst07) as sfcst07 , sum(fcst08) as sfcst08 , sum(fcst09) as sfcst09 , sum(fcst10) as sfcst10 , sum(fcst11) as sfcst11 , sum(fcst12) as sfcst12 , sum(fcst13) as sfcst13 , sum(fcst14) as sfcst14 , sum(fcst15) as sfcst15 , sum(fcst16) as sfcst16 , sum(fcst17) as sfcst17 , sum(fcst18) as sfcst18 , sum(fcst19) as sfcst19 , sum(fcst20) as sfcst20 , sum(fcst21) as sfcst21 , sum(fcst22) as sfcst22 , sum(fcst23) as sfcst23 , sum(fcst24) as sfcst24 , sum(fcst25) as sfcst25 , sum(fcst26) as sfcst26 , sum(fcst27) as sfcst27 , sum(fcst28) as sfcst28 , sum(fcst29) as sfcst29 , sum(fcst30) as sfcst30 , sum(fcst31) as sfcst31 , sum(fcst32) as sfcst32 , sum(fcst33) as sfcst33 , sum(fcst34) as sfcst34 , sum(fcst35) as sfcst35 , sum(fcst36) as sfcst36 , sum(fcst37) as sfcst37 , sum(fcst38) as sfcst38 , sum(fcst39) as sfcst39 , sum(fcst40) as sfcst40 , sum(fcst41) as sfcst41 , sum(fcst42) as sfcst42 , sum(fcst43) as sfcst43 , sum(fcst44) as sfcst44 , sum(fcst45) as sfcst45 , sum(fcst46) as sfcst46 , sum(fcst47) as sfcst47 , sum(fcst48) as sfcst48 , sum(fcst49) as sfcst49 , sum(fcst50) as sfcst50 , sum(fcst51) as sfcst51 , sum(fcst52) as sfcst52 , sum(fcst53) as sfcst53 , sum(fcst54) as sfcst54 , sum(fcst55) as sfcst55 , sum(fcst56) as sfcst56 , sum(fcst57) as sfcst57 , sum(fcst58) as sfcst58 , sum(fcst59) as sfcst59 , sum(fcst60) as sfcst60 , sum(fcst61) as sfcst61 , sum(fcst62) as sfcst62 , sum(fcst63) as sfcst63 , sum(fcst64) as sfcst64 , sum(fcst65) as sfcst65 , sum(fcst66) as sfcst66 from [AA].[dbo].[forcast] group by datepart(ISOWK, convert(datetime, date, 102) )  ) t2
          on datepart(ISOWK, convert(datetime, row_date, 102)) = t2.week2  
          where split = 451 and time != ' 6:45AM -  7:00AM' 
          group by datepart(ISOWK,  convert(datetime, row_date, 102)),sfcst01, sfcst02, sfcst03, sfcst04, sfcst05, sfcst06, sfcst07, sfcst08, sfcst09, sfcst10, sfcst11, sfcst12, sfcst13, sfcst14, sfcst15, sfcst16, sfcst17, sfcst18, sfcst19, sfcst20, sfcst21, sfcst22, sfcst23, sfcst24, sfcst25, sfcst26, sfcst27, sfcst28, sfcst29, sfcst30, sfcst31, sfcst32, sfcst33, sfcst34, sfcst35, sfcst36, sfcst37, sfcst38, sfcst39, sfcst40, sfcst41, sfcst42, sfcst43, sfcst44, sfcst45, sfcst46, sfcst47, sfcst48, sfcst49, sfcst50, sfcst51, sfcst52, sfcst53, sfcst54, sfcst55, sfcst56, sfcst57, sfcst58, sfcst59, sfcst60, sfcst61, sfcst62, sfcst63, sfcst64, sfcst65, sfcst66
          order by datepart(ISOWK,  convert(datetime, row_date, 102))
      

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2018-05-24
        • 2020-03-22
        • 1970-01-01
        • 2023-03-26
        • 2020-08-23
        • 1970-01-01
        相关资源
        最近更新 更多