2013-03-25 25 views
1

我有一個充滿產品的sql server數據庫,每個產品有1個樣式記錄和1個或多個sku記錄。我能夠使用dense_rank()成功地在這些表上分頁查詢,但是我不能在我的生活中弄清楚如何根據style_id以外的列來排序樣式,並且仍然能夠添加一個每種風格的增量排名。如何訂購帶有一對多關係和分頁的sql server查詢

我目前使用此查詢:

SELECT * 
FROM 
(
    SELECT 
    styles.style_id 
    styles.department, 
    styles.style, 
    styles.brand, 
    styles.description, 
    skus.sku_id, 
    skus.color, 
    skus.size, 
    skus.price, 
    skus.creation_date, 
    DENSE_RANK() OVER (ORDER BY styles.style_id) AS style_rank 
    FROM skus 
    LEFT OUTER JOIN styles ON styles.style_id=skus.style_id 
    WHERE skus.color='blue' 
    AND styles.brand='acme' 
) AS t1 
WHERE 
t1.style_rank > 0 AND t1.style_rank <= 25 

上面可以讓我在款式級別進行分頁,但我需要能夠根據價格ASC/DESC或ASC CREATION_DATE這些樣式排序/ DESC。能夠使用MAX(skus.price)排序樣式等集合函數來控制排序會很好,但這不是必需的。

爲了澄清,一種風格可能有三個skus,這三個skus中的每一個可能是不同的價格。

對於使用RDBMS的零售網站來說,這似乎是一個非常基本的需求,但我無法找到任何有關如何執行此操作的文檔。

任何有關如何做到這一點的建議將不勝感激。

編輯: 我解決了這個使用兩個查詢(顯示在我的答案下面)。

回答

0

我認爲你需要添加PARTITION BY styles.style_id代替:

SELECT * 
FROM 
(
    SELECT 
    styles.style_id 
    styles.department, 
    styles.style, 
    styles.brand, 
    styles.description, 
    skus.sku_id, 
    skus.color, 
    skus.size, 
    skus.price, 
    skus.creation_date, 
    DENSE_RANK() OVER (PARTITION BY styles.style_id 
         ORDER BY skus.createion_date DESC, skus.price) AS style_rank 
    FROM skus 
    LEFT OUTER JOIN styles ON styles.style_id=skus.style_id 
    WHERE skus.color='blue' 
    AND styles.brand='acme' 
) AS t1 
WHERE 
t1.style_rank > 0 AND t1.style_rank <= 25 
+0

我相信我已經試過了,但讓我再試一次。 – user1034772 2013-03-25 14:32:49

+0

@ user1034772 - 您可能需要使用'ROW_NUMBER()'而不是'DENSE_RANK()'。 – 2013-03-25 14:36:31

+0

我剛剛嘗試了上面的DENSE_RANK()和ROW_NUMBER(),但它們都是在單個樣式的上下文中對價格進行排序。我需要能夠限制顯示的樣式數量,但也能夠在排序之前對整個結果集進行排序。 – user1034772 2013-03-25 14:46:33

0

我想通了,用兩個查詢的解決方案。第一個查詢是獲取樣式。第二個是使用第一個查詢中的style_id來獲取所有skus的「multi-get」查詢。

首先查詢:

SELECT * 
FROM 
(
    SELECT DISTINCT 
    styles.style_id 
    styles.department, 
    styles.style, 
    styles.brand, 
    styles.description, 
    MAX(skus.price) AS max_price, 
    ROW_NUMBER() OVER (ORDER BY MAX(skus.price) DESC) AS price_rank 
    FROM skus 
    LEFT OUTER JOIN styles ON styles.style_id=skus.style_id 
    WHERE skus.color='blue' 
    AND styles.brand='acme' 
    GROUP BY styles.style_id, styles.department, styles.style, styles.brand, styles.description 
) AS t1 
WHERE 
t1.price_rank > 0 AND t1.price_rank <= 25 

第二個查詢:

SELECT 
    skus.style_id, 
    skus.sku_id, 
    skus.color, 
    skus.size, 
    skus.price, 
    skus.creation_date 
FROM skus 
WHERE skus.style_id ='styleid1' OR skus.style_id='styleid2' OR skus.style_id='styleid3' /* etc. */ 

現在填充樣式對象與第二個查詢相應的SKU。