2015-04-08 3 views
1

Может ли кто-нибудь помочь мне в решении ниже проблемы., используя self-join для извлечения уникальных столбцов

Table1:

MSISDN(PK) product_name BASE_SOCBoo PLAN_NAME Limit 

1 152  WHOADJTH2   N   ABC   10 
2 152  WADADJTH5   N   ABC   20 
2 152  THRWS33   Y   ABC  100 
3 149  WADADJTH4   N   ABC   5 
4 149  WADADJTH5   N   ABC   6 

Я пытаюсь показать для MSISDN будет product_name, который является обязательным, как (whoadjth2, whoadjth5, whoadjth4) и product_names THRWS31, THRWS32, THRWS33 не являются обязательными, если они существуют base_soc_boo флаг показан как включен, и в противном случае «N»

, когда я пытался ниже SQL я получаю выход, который я очень близко

SELECT flex.msisdn, 
    flex.product_name Flex_Soc, 
    CASE 
    WHEN base.product_name IN ('THRWS33', 'THRWS32', 'THRWS31') 
    AND base.base_soc_boo = 'Y' 
    THEN base.product_name 
    WHEN flex.product_name NOT IN ('THRWS33', 'THRWS32', 'THRWS31') 
    AND flex.base_soc_boo  = 'N' 
    THEN 'Not Prov' 
    END base_soc, 
    flex.plan_name, 
    flex.limit 
FROM table1, 
    (SELECT b.product_name, 
    b.plan_name, 
    b.msisdn, 
    b.base_soc_boo 
    FROM table1 b 
    WHERE product_name IN ('THRWS33', 'THRWS32', 'THRWS31') 
    AND b.base_soc_boo IN ('Y') 
)base 
WHERE flex.product_name <> base.product_name 
AND flex.plan_name  = base.plan_name 
AND flex.base_soc_boo IN ('N','Y') 

выход:

MSISDN FLEX_SOC BASE_SOC PLAN_NAME Limit 

1 152 WHOADJTH2 THRWS33  ABC  10 
2 152 WADADJTH5 THRWS33  ABC  20 
3 149 WADADJTH4 THRWS31  ABC  5 
4 149 WADADJTH5 THRWS31  ABC  6 

для 149, где флаг base_soc_boo является необходимость «N», чтобы отображаться как «Не Предоставлен»

+0

Очень трудно читать с этими странными именами. –

+0

таблица1 действительно гибкая? в противном случае, когда схема таблицы входит в игру, я не вижу таблицу «FLEX» в любом месте предложения from. Итак, каков желаемый результат? – xQbert

+0

да таблица1 - это гибкий. его ошибка typo Должно быть что-то вроде this table1 flex –

ответ

1

Ваш запрос кажется слишком сложным. В большинстве баз данных, вы можете использовать окно функции для этого:

SELECT msisdn, flex_soc, 
     coalesce(base_soc, 'Not Prov') as base_soc, plan_name, limit 
from (SELECT flex.msisdn, flex.product_name as Flex_Soc, 
      MAX(case when base_soc_boo = 'Y' then flex.product_name end) over 
       (partition by flex.msisdn) as base_soc, 
      flex.plan_name, flex.limit 
     FROM table1 flex 
    ) flex 
where base_soc_boo = 'N'; 

Вы не определяете базу данных так, ANSI-совместимый синтаксис кажется разумным.

+----+--------+-----------+----------+-----------+-------+ 
| | MSISDN | FLEX_SOC | BASE_SOC | PLAN_NAME | Limit | 
+----+--------+-----------+----------+-----------+-------+ 
| 6 | 152 | THRWS33 | THRWS33 | ABC  | 10240 | 
| 7 | 152 | WADADJTH5 | THRWS33 | ABC  | 4092 | 
| 8 | 152 | WHOADJTH2 | THRWS33 | ABC  | 1024 | 
| 9 | 149 | WADADJTH4 | Not Prov | ABC  | 512 | 
| 10 | 149 | WADADJTH5 | Not Prov | ABC  | 1024 | 
+----+--------+-----------+----------+-----------+-------+ 
+0

Спасибо, что он работает, но я вижу дополнительную строку, (6) на выходе, которая не является ожидаемой. –

+0

Можете ли вы, пожалуйста, помочь мне, так как я новичок в sql.why дополнительная строка выходит. THRWS33 показывает в flex_soc, который не должен быть. –

+0

Можете ли вы, пожалуйста, помочь мне, выход должен быть только 7,8 , Только 9,10 строк –

Смежные вопросы