2015-09-30 7 views
1

Моя БД - SQL Server 2012 SP1.SQL Server: сравнение данных в одной таблице

Вот мой стол:

DATE   F1   F2  F3 
2015-07-1   32   5  78 
2015-08-20  18   45  67 
2015-09-1   64   9  80 
2015-09-30  12   78  45 

Теперь я хотел бы, чтобы подсчитать сумму и выбрать только значение разности между последним и текущий месяц, так что в данном примере выбранные данные должны быть в период с августа по сентябрь, так например, для поля F1, для Августа потребуется уникальное значение, которое равно 18, затем два значения с сентября 64 + 12 = 76, затем подсчитайте разницу 76-18, поэтому значение F1 должно быть 58.

Заранее спасибо.

+0

В вашем примере вы указываете другие цифры, чем в своем тексте, по крайней мере, они не относятся к тому месяцу, о котором вы говорите ... Не могли бы вы создать таблицу с ожидаемым результатом с данными выше? – Shnugo

+0

Привет, Шнуго, я отредактировал мое сообщение. Месяцы - август и сентябрь. – kekimian

+0

Какой ты у тебя? – Balinti

ответ

0
Select 


    sum(case when Month(date) = month(curdatde()) and Year(date) = Year(curdatde()) then F1 else null end)- sum(case when Month(date) = (month(curdatde())-1) and Year(date) = Year(curdatde()) then F1 else null end) as'F1', 
    sum(case when Month(date) = month(curdatde()) and Year(date) = Year(curdatde()) then F2 else null end)- sum(case when Month(date) = (month(curdatde())-1) and Year(date) = Year(curdatde()) then F2 else null end) as'F2', 
    sum(case when Month(date) = month(curdatde()) and Year(date) = Year(curdatde()) then F3 else null end)- sum(case when Month(date) = (month(curdatde())-1) and Year(date) = Year(curdatde()) then F3 else null end) as'F3' from your table 

Это работает для MYSQL

0

Это, вероятно, более инженерии, но я думаю, что он делает то, что вы хотите. Я называю вашу таблицу «example_data». Первый CTE (summed_data) группирует ваши данные по месяцам и суммирует столбцы F. Второй CTE затем заказывает все это и занимает только последние два месяца (так что это предполагает, что у вас нет будущих данных). Он использует ROW_NUMBER() для присвоения 1 текущему месяцу и 2 к предыдущему месяцу. Затем в конечном SELECT он присоединяется к результату этого второго CTE. Используя идентификаторы строк, чтобы идентифицировать текущий и предыдущие месяцы, он принимает разницу в каждом столбце.

WITH summed_data (some_date, f1, f2, f3) 
AS 
(
    SELECT MAX(some_date), SUM(f1), SUM(f2), SUM(f3) 
    FROM example_data 
    GROUP BY MONTH(some_date), YEAR(some_date) 
), 
last_two_months (row_number, f1, f2, f3) 
AS 
(
    SELECT TOP 2 ROW_NUMBER() OVER(ORDER BY some_date DESC), f1, f2, f3 
    FROM summed_data 
    ORDER BY some_date DESC 
) 

SELECT CURRENT_MONTH.f1 - PRIOR_MONTH.f1, 
     CURRENT_MONTH.f2 - PRIOR_MONTH.f2, 
     CURRENT_MONTH.f3 - PRIOR_MONTH.f3 
    FROM last_two_months CURRENT_MONTH, last_two_months PRIOR_MONTH 
WHERE CURRENT_MONTH.row_number = 1 
    AND PRIOR_MONTH.row_number = 2