2013-09-26 3 views
2

SQL 쿼리를 수행하려고하지만 예상 한 결과를 얻을 수 없습니다. 나는 정말로 무엇이 잘못 될지 모른다.SQL Server에서 예상 쿼리를 가져올 수 없습니다.

나는 (product_variation_id, PRODUCT_ID, 설명, 성, 가격)

는 기본적으로,이 제품이 포함되어 포함 된 테이블 제품 (PRODUCT_ID, 제목) 및 기타 테이블 Product_Variation 있습니다. 각 제품에 대해 N 개의 유사 콘텐츠가 있어야합니다.

예를 들어

제품 : 설명 "T 셔츠"성 "남성"가격 "59.90"나는 무엇이 필요

이 제품 선택과 Product_Variation 보여주는 : 제목 Product_Variation "난 몰라" 가장 낮은 가격의 제품 만.

제품에 티셔츠, 자켓 또는 기타 유사 제품이있는 경우 신경 쓰지 않아도됩니다. 나는 가장 낮은 가격을 가진 변이를 얻을 필요가있다.

내 쿼리는 다음과 같습니다

SELECT b.product_id, b.title, MIN(b.price) as price, b.gender 

FROM (

     SELECT p.product_id, p.title, MIN(pv.price) AS price, pv.gender 
     FROM products p 
     join product_variation pv ON pv.product_id = p.product_id 
     GROUP BY p.product_id, p.title, pv.price, pv.gender 

    ) b  

GROUP BY b.product_id, b.title, b.price, b.gender 

Pls는, 내 example in SQL Fiddle

감사를 참조하십시오! 당신은 SQL 2008을 사용하고 있기 때문에

+1

'pv.price'로 그룹화하지 마십시오. 하위 쿼리로 충분합니다. [피들은 여기에 있습니다.] (http://sqlfiddle.com/#!6/7e8c2/4) – Kaf

+0

@Kaf - 좋아요, 작동합니다. 그러나 질의 결과는 성별 여성에 대한 모든 결과를 보여주고 성별에 대한 모든 결과를 보여줍니다. 남성 예를 들어 제목 -1 남성 제목 -1 여성 - 제목 -2 남성 제목 -2 여성 ..... 등 –

+1

모든 Title-1을 함께 묶는 ORDER 절을 추가하십시오. ORDER BY p.title, pv.gender, pv.price – taserian

답변

1

가장 낮은 가격으로 행을 찾을 ROW_NUMBER를 사용할 수 있습니다

SELECT * 
FROM products p 
INNER JOIN 
(SELECT 
    product_id, 
    Description, 
    Gender, 
    Price, 
    ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY price) Row 
FROM product_variation) 
pv ON pv.product_id = p.product_id 
AND Row = 1 

을 같은 가격이 변동이있는 경우 하나 개의 임의의 행을 얻을 것이다. 동일한 제품이있는 경우에도 당신은 단지 제품 당 하나를 원하는 경우,

;With b as (
    Select 
     p.product_id, 
     p.title, 
     pv.price, 
     pv.gender, 
     rank() over(partition by p.product_id order by pv.price) rk 
    From 
     products p 
      Inner Join 
     product_variation pv 
      On pv.product_id = p.product_id 
) 
Select 
    b.product_id, 
    b.title, 
    b.price, 
    b.gender 
From 
    b 
Where 
    rk = 1 

:

0

당신은 파티션 (그룹) 내에서 물건을 주문하는 rank() 윈도우 함수를 사용하지만, 동일한 항목에 동일한 순위를 부여 할 수 있습니다 대신 rank()

Example Fiddle

0
row_number()를 사용
관련 문제