2013-07-29 209 views
1

我剛剛創建具有以下細節的數據倉庫。按月產品銷售 - SQL

事實表

  1. 銷售

尺寸

  1. 供應商
  2. 產品
  3. 時間(範圍爲一年)
  4. 商店

我想查詢該產品具有按月最大的銷售,我指的是輸出到像

Month - Product Code - Num_Of_Items 
JAN  xxxx   xxxxx 
FEB  xxxx   xxxxx 

我試過12以下查詢

with product_sales as(
SELECT dd.month, 
    fs.p_id, 
    dp.title, 
SUM(number_of_items) Num 
FROM fact_sales fs 
INNER JOIN dim_products dp 
ON fs.p_id = dp.p_id 
INNER JOIN dim_date dd 
ON dd.date_id = fs.date_id 
GROUP BY dd.month, 
    fs.p_id, 
    dp.title 
) 
select distinct month,movie_id,max(num) 
from product_sales 
group by movie_id,title, month; 

而不是最大行,我有132條記錄。我需要這方面的指導。謝謝。

+0

如果你需要一行「每月」,你爲什麼** GROUP BY **別的,但只是一個月? – AKDADEVIL

+0

我想,如果我們使用聚合函數那麼我們需要這樣做。 – wali

回答

2

有關於你的查詢是沒有意義的一些事情,如:

  • 來自哪裏movie_id
  • 什麼是from abc?應該是from product_sales

這就是說,如果你需要一個月最大的產品銷售,你需要包括產品代碼(或電影ID或其他),你需要分析查詢。你會去是這樣的:

WITH product_sales AS (
    SELECT 
    dd.month, 
    fs.p_id, 
    dp.title, 
    SUM(number_of_items) Num, 
    RANK() OVER (PARTITION BY dd.month ORDER BY SUM(number_of_items) DESC) NumRank 
    FROM fact_sales fs 
    INNER JOIN dim_products dp ON fs.p_id = dp.p_id 
    INNER JOIN dim_date dd ON dd.date_id = fs.date_id 
    GROUP BY dd.month, fs.p_id, dp.title 
) 
SELECT month, p_id, title, num 
FROM product_sales 
WHERE NumRank = 1 

需要注意的是,如果有任何一個月的銷量榜首領帶,這個查詢將顯示當月所有頂級銷售。換句話說,如果產品代碼AAAABBBB綁在一月份銷量榜首,查詢結果將有一個排一月兩種產品。

如果你想每個月只有一行即使有一條領帶,使用ROW_NUMBER代替RANK(),但請注意,ROW_NUMBER將任意挑選贏家,除非你定義一個搶七。例如,具有最低p_id是決勝局,定義NumRank列如下:

ROW_NUMBER() OVER (
    PARTITION BY dd.month 
    ORDER BY SUM(number_of_items) DESC, p_id 
) NumRank 
+0

真的很抱歉。粘貼後有一點改變了查詢。 – wali

+0

不用擔心 - 我想這是發生了什麼,因爲我已經做了很多它自己:) –

+0

非常感謝。我只根據你所說的邏輯創建了12個查詢。再次感謝。 – wali

1

可以用戶MAX()KEEP(DENSE_RANK FIRST ORDER BY)選擇具有的最大價值movie_id #

... 
select 
    month, 
    MAX(movie_id) KEEP (DENSE_RANK FIRST order by num desc) as movie_id, 
    MAX(num) 
from 
abc 
group by month 
;