1
store item datekey onhand salesunits 
-------------------------------------------- 
001  A  50  65  2 
001  A  51  8  4 
001  A  52  0  8 
-------------------------------------------- 

達成するために必要なもの:ゼロより大きい最新の値を店舗やアイテムごとにマイナスします。したがって、上記の例では、8-14 = -6になります。T-SQL - 相関サブクエリからの集計を使用するすべての行の集計

相関サブクエリを使用して、最新の日付キーを決定してから、メインクエリに再び参加します。しかし、明らかにそうすることによって、私はsalesunitsを合計するために必要な他の行に関連するデータを失う:

これは私が持っているものであり、それは間違っている:あなたの助けを

select s1.Store, s1.Item, s1.OnHand, sum(salesunit) 
from sales s1 
    join (select top 1 store,item, max(DateKey) as datekey 
     from sales 
     where isnull(onhand,0) > 0 
      and DateKey in (50,51,52) 
     group by store, item) s2 on s2.store=s1.store and s2.item=s1.item and s2.datekey=s1.datekey 
group by s1.Store, s1.Item, s1.OnHand 

ありがとう!

答えて

2
; 
WITH totals AS (
    SELECT 
    *, 
    totalsalesunits = SUM(salesunits) OVER (PARTITION BY store, item), 
    rnk = ROW_NUMBER() OVER (PARTITION BY store, item 
           ORDER BY SIGN(onhand) DESC, datekey DESC) 
    FROM sales 
) 
SELECT 
    store, 
    item, 
    onhand, 
    totalsalesunits 
FROM totals 
WHERE rnk = 1 
+1

私の1だったがSIGNのために。いい感じです –

2

私はそれをこのようなものだろう:

まずいくつかのテストデータ:

DECLARE @tbl TABLE 
     (
      store VARCHAR(4), 
      item VARCHAR(2), 
      datekey INT, 
      onhand INT, 
      salesUnits INT 
     ) 

INSERT INTO @tbl 
VALUES 
    ('001','A',50,65,2), 
    ('001','A',51,8,4), 
    ('001','A',52,0,8) 

このようなクエリ:

;WITH cteTotalSales AS 
(
    SELECT 
     SUM(tbl.salesUnits) OVER(PARTITION BY 1) AS TotalSalesUnit, 
     tbl.store, 
     tbl.item, 
     ISNULL(tbl.onhand,0) AS onhand, 
     tbl.salesUnits, 
     tbl.datekey 
    FROM 
     @tbl AS tbl 
), cteLatest AS 
(
    SELECT 
     RANK() OVER 
      (
       PARTITION BY cteTotalSales.store,cteTotalSales.item 
       ORDER BY cteTotalSales.datekey DESC 
      ) AS iRank, 
     cteTotalSales.store, 
     cteTotalSales.item, 
     cteTotalSales.onhand, 
     cteTotalSales.salesUnits, 
     cteTotalSales.datekey 
    FROM 
     cteTotalSales 
    WHERE 
     (cteTotalSales.onhand-cteTotalSales.TotalSalesUnit)>0 
) 
SELECT 
    * 
FROM 
    cteLatest 
WHERE 
    iRank=1 
2
;with a as 
(
select rn = row_number() over (partition by store, item order by case when onhand = 0 then -1 else datekey end desc), 
Store, Item, OnHand, salesunit 
from sales 
) 
select store, item, sum(case when rn = 1 then onhand end)-sum(salesunit) OnHand, sum(salesunit) sumsalesunit from a 
group by store, item 
関連する問題