Как получить разницу между первым значением столбца First и последним значением столбца Last в наборе результатов хранимой процедуры? - PullRequest
0 голосов
/ 28 января 2011

Я получаю набор результатов для запроса ниже

SELECT
   CAST(SUM(CASE
               WHEN  S.TAXABLEAMT <=2000 THEN (S.INVOICEQTY)
            ELSE NULL END) AS DECIMAL(30,2)) AS QTY ,
    YEAR(S.invoicedate) YEAR1,Month(S.invoicedate) MNTH  
FROM
    SALESDATA S
where
   month(S.invoicedate) BETWEEN 1AND 4  and year(S.invoicedate) BETWEEN  2009 AND 2010  
GROUP BY
   YEAR(S.invoicedate),Month(S.invoicedate)
ORDER BY
   YEAR(S.invoicedate),Month(S.invoicedate)

как

QTY        MONTH/YEAR
250            01/2010
238            02/2010
450            03/2010
238            04/2010
150            05/2010
238            05/2010
650            06/2010
238            07/2010
250            08/2010
238            09/2010
250            10/2010
238            11/2010
250            12/2010
238            01/2009
250            01/2009
238            02/2009
450            03/2009
238            04/2009

Теперь я хочу разницу между QTY первого столбца первого значения (т.е. 250) и первого столбца последнего значения(т.е. 238) в результирующем наборе

как отдельный столбец (т.е. только одно значение).

Возможно ли это? (С отдельной таблицей или внутри той же таблицы в запросе)

С уважением,

NSJ

Ответы [ 2 ]

0 голосов
/ 28 января 2011
SELECT CAST(SUM(CASE WHEN S.TAXABLEAMT <=2000 THEN (S.INVOICEQTY) ELSE NULL END) AS DECIMAL(30,2)) AS QTY ,
YEAR(S.invoicedate) YEAR1,Month(S.invoicedate) MNTH,ROW_NUMBER() over (order by Year(invoicedate),Month(invoicedate)) as rn,
ROW_NUMBER() over (order by Year(invoicedate),Month(invoicedate)) as descrn into #temp
FROM SALESDATA S
where month(S.invoicedate) BETWEEN 1AND 4 and year(S.invoicedate) BETWEEN 2009 AND 2010 
GROUP BY YEAR(S.invoicedate),Month(S.invoicedate)
ORDER BY YEAR(S.invoicedate),Month(S.invoicedate)

declare @diffAmt int = (select top 1 Qty from #temp where rn = 1) - (select top 1 Qty from #temp where descrn = 1)
select *,@diffAmt as DiffAmt from #temp
0 голосов
/ 28 января 2011

Вот пример кода, который делает то, что вы хотите, используя cte.

declare @T table (id int identity, value int)

insert into @T values (10)
insert into @T values (20)
insert into @T values (30)

;with cte(id, value)
as (select id, value from @T)
select 
  id,
  value,
  (select top 1 value
   from cte
   order by id desc) - 
  (select top 1 value
   from cte
   order by id asc) as Diff
from cte   

Вот ваш запрос с использованием cte.Это совсем не проверено, так как у меня нет ваших таблиц или данных.

with cte(qty, year1, mnth)
as
(select
   cast(sum(case
            when  s.taxableamt <=2000
            then (s.invoiceqty)
            else null end) as decimal(30,2)) as qty ,
   year(s.invoicedate) year1,
   month(s.invoicedate) mnth  
 from
   salesdata s
 where
   month(s.invoicedate) between 1 and 4 and
   year(s.invoicedate) between  2009 and 2010  
 group by
   year(s.invoicedate),
   month(s.invoicedate)
)
select
  qty,
  year1,
  mnth,
  (select top 1 qty from cte order by year1, mnth desc) - 
    (select top 1 qty from cte order by year1, mnth asc) as diff
from cte    
order by year1, mnth
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...