T-SQL - 几个有计算的分组

时间:2016-03-03 02:43:11

标签: tsql stored-procedures cursor

我需要有关如何提出查询的帮助,其中表1和表2将被连接以执行计算。我有'光标'但我在概念化方面遇到了麻烦。一些kickstart将是一个巨大的帮助。

基本上我需要的是这样的东西:

表1:

Rep_Date    NumID   NumValue   Score    Period
1/10/2015   1       161        4        Q1
1/11/2015   1       167        2        Q1
1/12/2015   1       95         1        Q1
1/01/2016   1       150        1        Q2
1/02/2016   1       100        2        Q2
1/03/2016   1       600        5        Q2
1/10/2015   38      1          1        Q1
1/11/2015   38      1          2        Q1
1/12/2015   38      1          2        Q1
1/01/2016   38      1          1        Q2
1/02/2016   38      1          2        Q2
1/03/2016   38      1          4        Q2
1/10/2015   113     5          3        Q1
1/11/2015   113     2          4        Q1
1/12/2015   113     8          1        Q1
1/01/2016   113     11         4        Q2
1/02/2016   113     1          5        Q2
1/03/2016   113     5          3        Q2

表2

NumID   CalculationType
1        SUM
38       SUM
113      AVG

预期结果:

Rep_Date    NumID   Result  Period
1/10/2015   1       7       Q1
1/01/2016   1       8       Q2
1/10/2015   38      5       Q1
1/01/2016   38      7       Q2
1/10/2015   113     2.67    Q1
1/01/2016   113     4       Q2
  1. 通过NumID加入以获取计算类型。
  2. 使用“得分”字段来推导结果。
  3. 按NumID分组,期间

1 个答案:

答案 0 :(得分:0)

这应该有效:

declare @t1 table (Rep_Date varchar(50), numId int, numValue int, score int, period varchar(50));
insert into @t1 values


('1/10/2015','1','161','4','Q1'),
('1/11/2015','1','167','2','Q1'),
('1/12/2015','1','95','1','Q1'),
('1/01/2016','1','150','1','Q2'),
('1/02/2016','1','100','2','Q2'),
('1/03/2016','1','600','5','Q2'),
('1/10/2015','38','1','1','Q1'),
('1/11/2015','38','1','2','Q1'),
('1/12/2015','38','1','2','Q1'),
('1/01/2016','38','1','1','Q2'),
('1/02/2016','38','1','2','Q2'),
('1/03/2016','38','1','4','Q2'),
('1/10/2015','113','5','3','Q1'),
('1/11/2015','113','2','4','Q1'),
('1/12/2015','113','8','1','Q1'),
('1/01/2016','113','11','4','Q2'),
('1/02/2016','113','1','5','Q2'),
('1/03/2016','113','5','3','Q2');


declare @t2 table (numId int, CalculationType varchar(50));
insert into @t2 values
('1'        ,'SUM'),
('38'       ,'SUM'),
('113'      ,'AVG')

select
   min(t.rep_date) Rep_Date
  ,t.numId
  ,case when max(t2.CalculationType) = 'SUM' then sum(t.score)
        when max(t2.CalculationType) = 'AVG' then round(avg(1.0 * t.score), 2)
        else 0
   end Result
  ,t.period
from
  @t1 t
  join @t2 t2 on t.numId = t2.numId
group by
   t.period, t.numId
order by
  numId, period

输出

enter image description here