Сравните и вычтите записи 2 Таблица

У меня есть 2 таблицы (каждая из двух таблиц имеет одинаковую структуру) я получаю сумму двух таблиц с кодом ниже. Теперь я хочу найти сумму записей за предыдущий месяц и сумму текущего месяца и сравнить их. Если сумма предыдущего месяца больше, чем сумма текущего месяца. Выбираемые записи. Если нет, не выбирается

Table 1                                        Table 2<br>
StudentId=1  Score=50 Date =2017/01/01      StudentId= 1 Score=100 Date =2017/01/01<br>
StudentId=1  Score=20 Date =2017/02/01      StudentId= 1 Score=10 Date =2017/02/01<br>
StudentId=2  Score=60 Date =2017/01/01      StudentId= 2 Score=100 Date =2017/01/01<br>
StudentId=2  Score=540 Date =2017/02/01     StudentId= 2 Score=100 Date =2017/02/01<br>

Текущий результат:

StudentId       HighScoreUser<br>
1               180<br>
2               800<br>
---------------------------------<br>

Результат, который я хочу:

StudentId   Prev Month(2017/01/01)  Current Month(2017/02/01)<br>
1           150                     30<br>
2           160                     640<br>

1 -> 150 > 30 -> Верно? -> Да, так должно быть выбрано

2 -> 160 > 640 -> Верно? -> Нет, поэтому не должен быть выбран

Результат (выбранные значения) = StudentId, (Сумма предыдущего месяца - Сумма текущего месяца)


<br>`CREATE PROCEDURE SelectTopMonth
    @Date1  NVARCHAR(12),
    @Date2  NVARCHAR(12)
AS
    SELECT StudentId, ISNULL(SUM(Score),0) As HighScoreUser
FROM (SELECT StudentId, Score FROM tbl_ActPoint     WHERE Date >= @Date1    AND     Date <= @Date2
      UNION ALL
      SELECT StudentId, Score FROM tbl_EvaPoint     WHERE Date >= @Date1    AND     Date <= @Date2
     ) as T 
GROUP BY  StudentId ORDER BY HighScoreUser DESC
RETURN 0`

2 ответа

Решение

Вы можете использовать ведущую аналитическую функцию SQL Server, чтобы получить свой результат.

ТАБЛИЦА 1

create table table1 
(
  studentid integer,
  score integer,
  date date
);

insert into table1 values(1,50,'2017/01/01'); 
insert into table1 values(1,20,'2017/02/01');
insert into table1 values(2,60,'2017/01/01');
insert into table1 values(2,540,'2017/02/01');  

ТАБЛИЦА 2

create table table2
(
  studentid integer,
  score integer,
  date date
);
insert into table2 values(1,100,'2017/01/01'); 
insert into table2 values(1,10,'2017/02/01');
insert into table2 values(2,100,'2017/01/01');
insert into table2 values(2,100,'2017/02/01');  

Запрос:

with data  as (
select table1.studentid , (table1.score + table2.score) as pre_score, table1.date,
lead((table1.score + table2.score),1) over(partition by table1.studentid order by table1.studentid,table1.date) 
as cur_score
from table1 join table2 
on table1.studentid = table2.studentid 
and table1.date = table2.date
)
select * from data
where cur_score is not null 
and pre_score > cur_score

Добавил это условие согласно вашему комментарию "и pre_score > cur_score".

Я думаю, что вы ищете данные, как показано ниже:

Select StudentId, [2017/01/01] as [Prev Month(2017/01/01)],
                  [2017/02/01] as [Current Month(2017/02/01)] from (
    Select * from t1
    Union all
    Select * from t2
    ) a
    pivot (sum([Score]) for [Date] in ([2017/01/01],[2017/02/01]) ) p
    Where [2017/01/01] > [2017/02/01]
Другие вопросы по тегам