2017-03-15 1 views
-1

필자는 Carryover/new로 열을 표시해야하는 요구 사항이 있습니다.SQL에 사용자 정의 논리 추가하기

논리는 다음과 같습니다.

색상이 팔레트에있는 경우 'Dev type'열을 새로운 else carryover로 표시하십시오. 가상의 테이블 구조와 simillar 쿼리를 사용하여 비즈니스 시나리오를 작성하려고했습니다.

래 테이블

ID PalName  year 
1 Pal 1 2017 
2 Pal 2 2016 
3 pal 3 2017 
4 pal 4 2016 
5 pal 5 2017 

컬러 테이블

ID Color name requestedpalette 
1 Red   pal 1, pal 5, 
2 Green  na, 
3 Black  na,pal 1,pal 3 

시즌 표

ID Color ID Palette ID Season name 
1 1     3 Summer 
2 2     4 Winter 
쿼리

WITH masterdata AS 
    (SELECT season name, 
      color name, 
      season.is AS SeasonID, 
      color.id AS ColorID 
    FROM season 
    INNER JOIN color ON color.id=season.colorid 
    INNER JOIN palette ON palette.id=season.paletteid 
    WHERE palette.year=2017) 
SELECT colorname, 
     CASE 
      WHEN EXISTS 
        (SELECT 1 
        FROM masterdata 
        WHERE ',' || color.requestedpalette LIKE '%,' || masterdata.PalName || ',%') THEN 'New' 
      ELSE 'Carryover' 
     END DevelopmentType 
FROM color 

WITH를 사용하지 않고 위를 가져 오기 위해 더 좋은 방법이 있나요? SQL 쿼리에 설정된 전체 결과에 따라 컬럼의 값을 설정하는 방법

+0

미래에는 내가했던 것처럼 질문을 형식화하십시오. 그게 정말 읽을 수 있습니다. –

답변

0

시도 :

SELECT color, 
    nvl((SELECT distinct 'New' 
    FROM pal 
    WHERE regexp_like(color.requestedpalette, 
     '^([^,]*, *)*' || PalName || '(,.*)*$') 
    AND year = 2017 
    ), 'Carryover') DevelopmentType 
FROM color 

당신은 당신의 절에 PalName이없는, 그래서 무엇을 생각하지 않는다 당신은 그대로 일하게 될 것입니다. 요청한 팔레트를 PalName과 비교하기 때문에 ID로 3 개의 테이블을 모두 조인하지 않았습니다. 계절이있는 팔레트 만 필요한 경우 해당 테이블을 하위 쿼리 열로 가져옵니다.

은 정말, DATAENTRY 오류를 정리 한 후, 당신은 단지 서브 쿼리로 메인 쿼리에 masterdata 쿼리를 이동하고

color.requestedpalette LIKE masterdata.PalName || ',%' 
or color.requestedpalette LIKE '%, ' || masterdata.PalName || ',%' 
or color.requestedpalette LIKE '%, ' || masterdata.PalName 
or color.requestedpalette = masterdata.PalName 

에 가입 왼쪽은 원래 디자인에 따라 작동 할 수 있습니다.

SELECT distinct colorname, 
    (case when PalName is not null 
    then 'New' else 'Carryover' end) DevelopmentType 
FROM color 
LEFT JOIN (
    SELECT PalName 
    FROM season 
    INNER JOIN color ON color.id=season.colorid 
    INNER JOIN palette ON palette.id=season.paletteid 
    WHERE palette.year=2017 
) masterdata 
ON color.requestedpalette LIKE masterdata.PalName || ',%' 
OR color.requestedpalette LIKE '%, ' || masterdata.PalName || ',%' 
OR color.requestedpalette LIKE '%, ' || masterdata.PalName 
OR color.requestedpalette = masterdata.PalName 

편집 16 월-2017 PalName 가능성 color.requestedpalette 쉼표에 둘러싸인 밀폐 여부 PalName의 하위 것에 대한 계정.

관련 문제