2015-06-25 5 views
1

Я не могу понять, как сделать это сравнение, выбрать для обоих лет для каждого растения.Как сделать этот SQL SELECT?

SELECT PlantName, SUM(Amount) AS Amount_Harvested_2014 
FROM Harvest 
WHERE year=2014 
GROUP BY PlantName 

В желаемом выходе строка должна выглядеть следующим образом:

PlantName 2014Amount 2015Amount 2015-2014Amount 

В таблице:

CREATE TABLE Harvest(
harvest_id int PRIMARY KEY IDENTITY(1,1), 
PlantName nvarchar(20) NOT NULL FOREIGN KEY REFERENCES Plants(PlantName), 
Amount int NOT NULL, 
year int, 
harvester_id int NOT NULL FOREIGN KEY REFERENCES Workers(Worker_ID) 
) 

И пример содержимого таблицы:

harvest_id PlantName Amount year harvester_id 
1   Rose  32  2015 2 
2   Rose  12  2015 5 
+0

Да ms sql server 2012 –

ответ

1

Один простой способ сделать это (что т не лучшим) является использование условной агрегации, как это:

select 
    PlantName 
    ,sum(case when year=2014 then Amount else 0 end) as "2014amount" 
    ,sum(case when year=2015 then Amount else 0 end) as "2015amount" 
    ,sum(case when year=2015 then Amount else 0 end) - sum(case when year=2014 then Amount else 0 end) as "2015-2014Amount" 
from harvest 
group by plantname 
+0

Спасибо, но какой-то другой метод был бы лучше :) Какие-то СОЕДИНЕНИЯ или что-то в этом роде? –

+0

И да, это РАБОТАЕТ !!! Но что-то с более низким навыком было бы лучше. :) –

+0

@ user3687719 Я действительно не думаю, что использование объединений было бы проще, но взгляните на это, если вы хотите увидеть решение на основе объединений: http://www.sqlfiddle.com/#!6/32bbf/ 1 – jpw

0

Хороший способ сделать это было бы с помощью pivot опции в сервере SQL:

select *, [2015] -[2014] as '2015-1014' 
from 
(
    select PlantName, year, Amount 
    from Harvest 
) src 
pivot 
(
    sum(Amount) 
    for year in ([2014], [2015]) 
) piv; 

Который дал бы следующие выход:

PlantName 2014 2015 2015-1014

Apple, 2 15 13

Rose 11 44 ​​33

Это также облегчило бы обновление, если бы была добавлена ​​больше лет истории.

Смежные вопросы