2014-10-22 2 views
0

이것은 나에게 만들어진이 질문의 변형입니다. 나는이 문제가다른 코드에 대한 더 나은 우연한 일치로 SQL 삽입 가격

SQL Insert Price with better coincidence of code

, 나는 가격 항목과 다른있는 테이블을 가지고있다. 이 품목은 여러 가지 가격으로 여러 코드를 가질 수 있지만이 가격은 일련의 코드에서 가장 좋은 우연의 일치가되어야합니다.

예를 들어, 내가 코드 AAA123있는 제품을 가지고 있고 나는 코드 AAA124와 다른 제품이있다. 3 가지 가격이 있습니다. 하나는 AAA로 시작하는 제품이고 다른 하나는 AAA124 제품입니다. 코드 AAA124 적용 할 수 2 개 가격이 내가 얻을 수있는 방법

DECLARE @Prices TABLE (CodeMatch VARCHAR(10), Price MONEY) 
DECLARE @Products TABLE (ProductCode VARCHAR(10)) 
INSERT @Prices VALUES ('AAA124', 10), ('AAA', 20), ('AAA124', 15) 
INSERT @Products VALUES ('AAA123'), ('AAA124') 
SELECT 
    ProductCode, 
    (SELECT TOP 1 Price FROM @Prices ORDER BY LEN(REPLACE(ProductCode, CodeMatch, ''))) 
FROM @Products 

를 선택 할 수있다 : 그래서, 나는이 같은 끝낼? 위의 예에서 첫 번째 AAA124 만 가져오고 대신 두 가격을 선택 항목에 추가해야합니다.

나는에 의해 별개의 그룹과 시도했다 그러나 나는이 작품 얻을 수 없습니다.

귀하의 도움에 감사드립니다. 나는 당신의 논리를 따른다면

답변

0

이 시도 :

SQL Fiddle

MS SQL 서버 2012 스키마 설정 :

검색어 1 :

DECLARE @Prices TABLE (CodeMatch VARCHAR(10), Price MONEY) 
DECLARE @Products TABLE (ProductCode VARCHAR(10)) 
INSERT @Prices VALUES ('AAA124', 10), ('AAA', 20), ('AAA124', 15), ('AAA12',30) 
INSERT @Products VALUES ('AAA123'), ('AAA124'), ('AAA') 


;WITH CTE 
AS 
(
    SELECT p.ProductCode, 
      pr.Price, 
      ROW_NUMBER() OVER 
      (PARTITION BY P.ProductCode ORDER BY LEN(pr.CodeMatch) DESC) RN 
    FROM @Products p 
    INNER JOIN @Prices pr 
     ON p.ProductCode LIKE pr.CodeMatch + '%' 
    WHERE NOT EXISTS (SELECT * FROM @Prices pr2 WHERE pr2.CodeMatch = p.ProductCode) 
) 
SELECT p.ProductCode, pr.Price 
FROM @Products p 
INNER JOIN @Prices pr 
    ON p.ProductCode = pr.CodeMatch 
UNION 
SELECT p.ProductCode, p.Price 
FROM CTE P 
WHERE P.RN = 1 

Results :

| PRODUCTCODE | PRICE | 
|-------------|-------| 
|   AAA | 20 | 
|  AAA123 | 30 | 
|  AAA124 | 10 | 
|  AAA124 | 15 | 
+0

내가 사용할 수없는 이유는 AAA를 시작하는 제품에 가격이 적용되고 제품 AAA123에 대해 가격이 책정 된 경우 가격이 모두 들고 가장 좋은 우연의 일치가되기 때문입니다. –

+0

@ user3243074 이것은 당신이 원하는 바를 수행합니다. 결과를 보여주기 위해 대답을 업데이트하고 있습니다. –

+0

예 @ 스티브 포드, 그것이 제가 문제를 해결하지 못했던 방법입니다. 고맙습니다. –

1

는 문제는 TOP 1에서 1입니다. 당신이 원하는 것은 최고의 길이와 같은 길이의 모든 것입니다. 이것은 DENSE_RANK()을 제안합니다. 이제

, 당신이 제품에 대한 (잠재적) 이상의 가격을 반환하기 때문에, 당신은 상관 하위 쿼리를 사용할 수 없습니다. 대신 APPLY을 사용하십시오. 그래서, 이것은 당신이 원하는 것을 생각 :

SELECT p.ProductCode, pr.Price 
FROM @Products p CROSS APPLY 
    (SELECT Price, 
      DENSE_RANK() OVER (ORDER BY LEN(REPLACE(ProductCode, CodeMatch, ''))) as seqnum 
     FROM @Prices pr 
    ) pr 
WHERE seqnum = 1; 

Here

는 SQL 바이올린입니다. 그것은 당신이 원하는 것을하는 것처럼 보입니다.

+0

나는이 예제 버디로 증명하지만 대신 모든 제품의 모든 가격을 반환합니다. –

관련 문제