2016-04-09 14 views
0

Bitte helfen Sie mir. Ich schrieb die AbfrageSQL Server: Fehler MSG 102 und MSG 156

with cte as 
( 
    select 
     *, 
     row_number() over (partition by product order by date desc) as rownumber 
    from 
     saleslist 
    where 
     datediff(month, date, getdate()) < 2 
    ) 
    select 
     product, 
     ((max(case when rownumber = 1 then price end) - 
      max(case when rownumber = maxn then price))/
      max(case when rownumber = maxn then price end) 
     ) 
    from 
     (select cte.*, max(rownumber) over (partition by product) as maxn 
     from cte) 
group by product 

und ich habe folgende Meldungen

Msg 102, Ebene 15, Status 1, Zeile 13
falsche Syntax nahe ')'.

Msg 156, Ebene 15, Status 1, Zeile 18
Falsche Syntax in der Nähe des Schlüsselwortes 'group'.

Könnte mir bitte jemand bitte sagen, wie ich das beheben kann?

+0

Was ist der SQL Server-Version unterstützt? – dnoeth

Antwort

0
with cte as 
( 
    select *, 
    row_number() over (partition by product order by date desc) as rownumber 
    from saleslist 
    where datediff(month, [date], getdate()) < 2 
    ) 
select product, 
    (
    (max(case when rownumber = 1 then price end) - 
     max(case when rownumber = maxn then price end) --< missing end here 
     )/
     max(case when rownumber = maxn then price end) 
     ) 
from 
(select cte.*, max(rownumber) over (partition by product) as maxn 
    from cte) t --< needs an alias here 
group by product 
+0

Danke M.Ali !!!! Wirklich zu schätzen, dass !!! – Deepleeqe

0

Sie benötigen einen Tabellenalias für die Unterabfrage. Ihre Abfrage ist jedoch zu kompliziert. Die maximale Zeilenzahl ist die count(*) der Zeilen:

with cte as ( 
     select sl.*, 
      row_number() over (partition by product order by date desc) as rownumber, 
      count(*) over (partition by product) as maxrn 
     from saleslist sl 
     where datediff(month, date, getdate()) < 2 
    ) 
select product, 
    (
    (max(case when rownumber = 1 then price end) - 
     max(case when rownumber = maxn then price) 
     )/
     max(case when rownumber = maxn then price end) 
     ) 
from cte 
group by product; 
+0

Danke Gordon !!! Du hilfst mir wirklich sehr !!! – Deepleeqe

1

SQL Server 2014 FIRST/LAST_VALUE

with cte as 
    ( 
     select *, 
      product, 
      price as first_price, 
      row_number() over (partition by product order by date) as rownumber, 
      last_value(price) -- price of the row with the latest date 
      over (partition by product 
       order by date rows 
       rows between unbounded preceding and unbounded following) as last_price 
      count(*) over (partition by product) as maxrn 
     from saleslist sl 
     where datediff(month, date, getdate()) < 2 
    ) 
select product, 
     (last_price - first_price)/first_price 
from cte 
where rownumber = 1; 
+0

Es ist großartig !!! Danke, du hast nichts getan !!!! Dieser Code ist sehr nützlich !!! – Deepleeqe

Verwandte Themen