Czy możesz pomóc zaznaczyć zduplikowane wartości w dodatkowej kolumnie bez grupowania zduplikowanych wartości?

Zobacz moje przykładowe dane (po prawej przykład, co mam i co muszę osiągnąć):

enter image description here

Jak widać, mam identyfikator produktu z przyrostkiem E (moc) i G (gaz). Niektóre identyfikatory produktów są zduplikowane: ten sam identyfikator produktu - jeden z E , a drugi z G tworzy podwójny produkt .

Identyfikator produktu tylko z E tworzy Power_Only_product , identyfikator produktu tylko z G tworzy Gas_Only_product , ten sam identyfikator produktu z < strong> E i G tworzy podwójny produkt .

Trudność polega na dodaniu kolumny we właściwej witrynie z informacją, który identyfikator to podwójny produkt, a który to tylko moc lub tylko gaz.

Czy możesz mi pomóc uzyskać taką kolumnę bez grupowania identyfikatorów produktów? Z góry dziękuję! Paweł

0
Pawel_L 1 kwiecień 2020, 20:54

3 odpowiedzi

Najlepsza odpowiedź
SELECT t1.*,
       CASE WHEN t2.CustomerAccount IS NOT NULL
            THEN 'Dual Product'
            WHEN t1.Product = 'Gas'
            THEN 'Gas Only'
            WHEN t1.Product = 'Power'
            THEN 'Power Only'
            ELSE 'Wrong product type'
            END ProductType
FROM sourcetable t1
LEFT JOIN sourcetable t2 ON t1.CustomerAccount = t2.CustomerAccount
                        AND t1.Product != t2.Product    

Zapytanie NIE używa ProductID i NIE sprawdza, czy pasuje do CustomerAccount i / lub Product. Będzie to nadmiar pracy bez zysku.

0
Akina 1 kwiecień 2020, 18:31

Nie wspominasz, której bazy danych używasz, więc zakładam, że to MySQL 8.x.

Prawdopodobnie lepiej jest oddzielić ID od TYPE za pomocą CTE. Wtedy zapytanie staje się dużo łatwiejsze. Na przykład:

with
x as ( -- this CTE just to separate the ID from the TYPE
  select *,
    substring(productid, 1, char_length(productid) - 1) as id,
    right(productid, 1) as type
  from t
)
select x.*, case when y.id is null then 'Power Only' else 'Dual' end
from x
left join y on x.id = y.id and y.type = 'G'
where x.type = 'E'
union all
select x.*, case when y.id is null then 'Gas Only' else 'Dual' end
from x
left join y on x.id = y.id and y.type = 'E'
where x.type = 'G'
order by id, type

Zwróć uwagę, że używam UNION ALL. Dzieje się tak, ponieważ MySQL nie implementuje (jeszcze) PEŁNYCH POŁĄCZEŃ ZEWNĘTRZNYCH. Sztuczka polega na tym, aby powtórzyć zapytanie nieco odwrócone .

0
The Impaler 1 kwiecień 2020, 18:26

Jeśli używasz MySQL 8.0, możesz to zrobić tylko z funkcjami okna, bez łączenia, podzapytania lub CTE.

Proponuję po prostu porównać maksymalne i minimalne wartości product dla każdego klienta; jeśli się różnią, masz „podwójny produkt”.

select
    t.*,
    case when min(product) over(partition by customer_account) <> max(product) over(partition by customer_account)
        then 'Dual Product' 
        else concat(product, ' Only')
    end single_or_dual_product
from mytable t
1
GMB 1 kwiecień 2020, 23:44