Parallel Date Sales SQL View

柔情痞子 提交于 2019-12-11 13:48:40

问题


I have a challenge which I can't seem to resolve on my own and now need help!

I have a requirement to show parallel year date sales via SQL and by that I mean if today (20/08/2015) Customer A has purchased products worth 500, I want to know how much Customer A spent on the same day last year (so 20/08/2014).

Here's a SQL fiddle where I've built everything (I reckoned that would be easiest for you guys). I have 3 dimensions (DimProduct, DimDate and DimCustomer), a fact table (FactSales) and a view (VW_ParallelSales) which I've built on top. I have also left a query on the right hand side with what I'm trying to achieve. If you run the query you will see that for Antonio, the SaleAmount on 20140820 was 3500 and if you look at the very bottom of the table, you can see there's one more record for Antonio in the fact table on 20150820 for 6500. So esentially, what I want is to have that 3500 which was sold on 20140820 (which is the parallel year date of 20150820) under the column ParallelSales (which at the moment is showing as NULL).

It all works like a charm if I don't include the ProductKey in the view and have just the CustomerKey (see this fiddle). However, as soon as I add the Product Key, because there is no exact match of CustomerKey-ProductKey that has happened in the past, I'm getting NULLS for ParallelSales (or at least that's what I think the reason is).

What I want to be able to do is then use the view and join on both DimCustomer and DimProduct and run queries both ways, i.e.:

Query 1: How much did Customer A spend today vs today last year? Query 2: How much of Product A did we sell today vs today last year?

At the moment, as is, I need to have 2 views for that - one that joins the two sub-queries in the view on CustomerKey and the other one - on ProductKey (and obviously the dates).

I know it's a lot to ask but I do need to get this to work and would appreciate your help immensely! Thanks :)


回答1:


For customer sales in diferent years.

SQL Fiddle Demo

SELECT DimCustomer.CustomerName,
       VW_Current.Saledate,
       VW_Current.ParallelDate,
       VW_Current.CurrentSales,
       VW_Previous.CurrentSales as ParallelSale

FROM   DimCustomer 
       INNER JOIN VW_ParallelSales VW_Current
           ON DimCustomer.CustomerKey = VW_Current.CustomerKey
       LEFT JOIN VW_ParallelSales VW_Previous
           ON VW_Current.ParallelDate = VW_Previous.Saledate
          AND DimCustomer.CustomerKey = VW_Previous.CustomerKey
ORDER BY 1, 2            

For productkey

SQL Fiddle Demo

With sales as (
    SELECT 
           DimProduct.ProductKey,
           DimProduct.ProductName,
           VW_ParallelSales.Saledate,
           VW_ParallelSales.ParallelDate,
           VW_ParallelSales.CurrentSales,
           VW_ParallelSales.ParallelSales
    FROM   DimProduct INNER JOIN VW_ParallelSales ON DimProduct.ProductKey = 
           VW_ParallelSales.ProductKey
)
SELECT 
   s_recent.ProductName,
   s_recent.Saledate ThisYear,
   s_old.Saledate PreviousYear,
   s_recent.CurrentSales CurrentSales,
   s_old.CurrentSales ParallelSales
FROM 
    SALES s_recent 
    left outer join SALES s_old 
        on s_recent.saledate = s_old.saledate + 10000
       and s_recent.ProductKey = s_old.ProductKey


来源:https://stackoverflow.com/questions/32125779/parallel-date-sales-sql-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!