2013-08-02 1 views
0

Мне нужно показать результаты текущего года и предыдущего года. В идеале, я хочу, чтобы результаты выглядели так:Вложенный выбор с динамическим, где

ID|CYTD|PYTD 
# |Sum |Sum 

И запрос, который у меня выглядит, как показано ниже. Проблема в том, как установить, где он должен совпадать с тем же идентификатором, что и строка, которую имеет текущий год.

select Table.ID, 
SUM(Table.Column) as CYTD, 

(select SUM(Table.Column) from Table 
where Table.Id = ?? and Table.Year between Prev and Current 
group by Table.Id) as PYTD 

Where Table.Year between Current and Future 
group by Table.Id 
+0

Вы можете описать таблицу? У этого есть Годовая Колонка? Каким типом данных является этот столбец? –

+0

ID int, сумма десятичного числа, дата и время. Его вид больше, чем тот, и запрос тоже, поэтому я попытался упростить его, чтобы разделить его на части. – user2577981

ответ

0

попробовать что-то вдоль этих линий:

SELECT TT.ID, 
    SUM(TT.amount) AS CYTD, 
    (SELECT SUM(T.amount) 
    FROM YOURTABLE T 
    WHERE T.Id = TT.id 
     AND T.DATE BETWEEN '2012-01-01' AND '2013-01-01' 
    GROUP BY T.Id) AS PYTD 
FROM YOURTABLE TT 
WHERE TT.DATE BETWEEN '2013-01-01' AND '2014-01-01' 
GROUP BY TT.Id 

Поскольку yourtable появляется более чем один раз в запросе, вы должны дать ему псевдоним в каждом появлении, а затем сравнить их идентификаторы, и что должно дайте результат, который вы хотите.

EDIT:

Если вы хотите, чтобы быть динамичным, и использовать в текущем году в качестве ссылки, вы можете сделать это следующим образом:

SELECT TT.ID, 
    SUM(TT.amount) AS CYTD, 
    (SELECT SUM(T.amount) 
    FROM YOURTABLE T 
    WHERE T.Id = TT.id 
     AND YEAR(T.DATE) = YEAR(now()) 
    GROUP BY T.Id) AS PYTD 
FROM YOURTABLE TT 
WHERE YEAR(TT.DATE) = YEAR(now()) - 1 
GROUP BY TT.Id; 

Смотрите эту fiddle, чтобы увидеть его в действии.