Агрегирование строки, если она появляется несколько раз - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть набор данных, который выглядит следующим образом:

| Upper_Level_Part_Number | CUM_PART_NUM | Alternate_Part | Make_Buy | Quantity_Needed |
|:-----------------------:|:------------:|:--------------:|:--------:|:---------------:|
|          AAB233         |    IEO333    |        N       |     B    |        1        |
|          AAB233         |    IEO333    |        N       |     M    |        1        |
|          AAB233         |    IEO333    |        Y       |     B    |        1        |
|          AAB233         |    IEO333    |        Y       |     M    |        1        |

Я пытаюсь создать выборку из этих данных, которая выглядит следующим образом:

| Upper_Level_Part_Number | CUM_PART_NUM | Alternate_Part | Make_Buy | Quantity_Needed |
|:-----------------------:|:------------:|:--------------:|:--------:|:---------------:|
|          AAB233         |    IEO332    |        Both    |     Both |        1        |

По сути, имитируя логику c, которая гласит:

Если CUM_PART_NUM имеет и B, и M для Make_Buy, измените его на Both. Если CUM_PART_NUM имеет N и Y для Alternate_Part, измените его на Both

Я попытался использовать:

SELECT
    CUM_PART_NUM,
    CASE WHEN Make_Buy = 'B' AND Make_Buy = 'M' THEN 'Both' ELSE Make_Buy END AS Make_Buy 

FROM    
    BOM

Но get:

CUM_PART_NUM    Make_Buy
IEO333  B
IEO333  M
IEO333  B
IEO333  M

Я настроил SQLFIDDLE для демонстрации.

Как я могу агрегировать, если CUM_PART_NUM удовлетворяет условию?

1 Ответ

3 голосов
/ 26 февраля 2020

Примерно так:

select Upper_Level_Part_Number, CUM_PART_NUM,
       (case when min(Alternate_Part) = max(Alternate_Part)
             then min(Alternate_Part) else 'Both'
        end) as Alternate_Part,
       (case when min(Make_Buy) = max(Make_Buy)
             then min(Make_Buy) else 'Both'
        end) as Make_Buy,
       Quantity_Needed
from t
group by Upper_Level_Part_Number, CUM_PART_NUM, Quantity_Needed;
...