2015-01-23 3 views
1

사실 및 날짜 차원 테이블이 있습니다. 필자는 모든 날짜 멤버에 대해 집계 함수 (sum (amount))를 반환하는 쿼리를 작성해야합니다. 그러나이 집계 함수는 날짜를 기준으로 필터링해야합니다.tsql 분석 쿼리

SELECT D.DATE 
     ,(
     SELECT sum(inline.InventoryRetailAmount) 
     FROM InvFactMain inline 
     WHERE inline.DocumentDate >= DATEADD(day, - @x, D.DATE) 
      AND inline.DocumentDate < dateadd(day, - @y, D.DATE) 
     ) AS [RetailAmount] 
FROM InvFactMain F 
    JOIN Dates D ON D.Date_ID = F.DateId 
GROUP BY D.DATE 

나는 그것을 구현하는 더 효율적인 방법이 있는지 해요 :

FACT table: InvFactMain 
Dim table: Dates 

현재 나는이 쿼리가 있습니다.

어떤 아이디어 나 SQL 2012을 사용하고, 그래서 LAG, LEAD 등의 분석 기능을 사용할 수 있습니다 •? 나는이 올바르게 수행하는 것을 이해 해요, 난이 잘해야한다고 생각

+0

좀 더 자세히 알려주세요 **이 집계 함수는 반환 날짜에 필터 기반이되어야합니다 ** –

답변

0

...

SELECT D.Date, q.s AS [Sum] 
FROM Dates D 
CROSS APPLY (
    SELECT SUM(F.InventoryRetailAmount) s 
    FROM InvFactMain F 
    WHERE F.Date_ID = D.DateID 
      AND D.Date BETWEEN DATEADD(day, [email protected], D.Date) AND DATEADD(day, [email protected], D.Date) 
) q 
0

이 당신을 도울까요?

SELECT D.Date , 
     SUM(inline.InventoryRetailAmount) AS amount 
FROM InvFactMain F 
     INNER JOIN Dates D ON D.Date_ID = F.DateId 
     INNER JOIN InvFactMain inv ON inv.DocumentDate >= DATEADD(DAY, [email protected], 
                   D.Date) 
             AND inv.DocumentDate < DATEADD(DAY, [email protected], 
                   D.Date) 
GROUP BY D.Date 
HAVING SUM(inline.InventoryRetailAmount) = YOUR_FILTER 
0

나는 창 기능을 사용하여 목표를 달성 할 수 있다고 생각합니다. 예를 들어 모험 작품을 사용했습니다.

SELECT  d.FullDateAlternateKey 
      ,f.SalesAmount 
      ,TotalSales = sum(SalesAmount) OVER (PARTITION BY d.FullDateAlternateKey ORDER BY d.FullDateAlternateKey   ) 
      ,RunningTotalPerDay = sum(SalesAmount) OVER (PARTITION BY d.FullDateAlternateKey ORDER BY d.FullDateAlternateKey ROWS UNBOUNDED PRECEDING) 
      ,RunningTotalLastTenDays = sum(SalesAmount) OVER (ORDER BY d.FullDateAlternateKey ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) 
FROM   [dbo].[DimDate] d 
      JOIN [dbo].[FactInternetSales] f 
      ON d.DateKey = f.OrderDateKey 

쿼리의 출력 : 귀하의 답변

+----------------------+-------------+------------+--------------------+-------------------------+ 
| FullDateAlternateKey | SalesAmount | TotalSales | RunningTotalPerDay | RunningTotalLastTenDays | 
+----------------------+-------------+------------+--------------------+-------------------------+ 
| 2005-07-01   | 3578.27  | 14477.3382 | 3578.27   | 3578.27     | 
| 2005-07-01   | 3399.99  | 14477.3382 | 6978.26   | 6978.26     | 
| 2005-07-01   | 3399.99  | 14477.3382 | 10378.25   | 6799.98     | 
| 2005-07-01   | 699.0982 | 14477.3382 | 11077.3482   | 4099.0882    | 
| 2005-07-01   | 3399.99  | 14477.3382 | 14477.3382   | 4099.0882    | 
| 2005-07-02   | 3578.27  | 13931.52 | 3578.27   | 6978.26     | 
| 2005-07-02   | 3578.27  | 13931.52 | 7156.54   | 7156.54     | 
+----------------------+-------------+------------+--------------------+-------------------------+ 
0

감사합니다. 나는 그것을 구현하는 매우 간단한 방법을 발견 : 은 (그냥 조인 술어에 필터를 추가)

select d.date_id,sum(f.InventoryRetailAmount) from InvFactMain f inner join dates d 
on f.DocumentDate > dateadd(day,[email protected],d.date) and f.DocumentDate< dateadd(day,[email protected],d.date) 
group by d.Date_ID 
order by d.Date_ID 

완벽하게 작동합니다.