2008-10-24 17 views
8

mam dane, które wyglądaSQL - wiele wartości oddzielonych przecinkami przy użyciu GROUP BY

CUSTOMER, CUSTOMER_ID, PRODUCT 
ABC INC 1   XYX 
ABC INC 1   ZZZ 
DEF CO  2   XYX 
DEF CO  2   ZZZ 
DEF CO  2   WWW 
GHI LLC 3   ZYX 

Chciałbym napisać kwerendę, która by uczynić dane wyglądać następująco:

CUSTOMER, CUSTOMER_ID, PRODUCTS 
ABC INC 1   XYX, ZZZ 
DEF CO 2   XYX, ZZZ, WWW 
GHI LLC 3   ZYX 

Korzystanie z Oracle 10g, jeśli pomaga. Widziałem coś, co działałoby przy użyciu MYSQL-a, ale potrzebuję zwykłego odpowiednika SQL lub ORACLE. Widziałem także przykłady zapisanych procesów, które można wykonać, jednak nie mogę użyć zapisanego proc z produktem, którego używam.

Oto Jak to działa w MySQL jakbym korzystali

SELECT CUSTOMER, 
     CUSTOMER_ID, 
     GROUP_CONCAT(PRODUCT) 
FROM MAGIC_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID 

Dziękuję.

+0

Jak zrobić to samo w SQL Server –

Odpowiedz

4

This link odnosi się do wielu przykładów różnych sposobów na to zrobić w Oracle. Sprawdź, czy jest coś, co masz do dyspozycji w swojej bazie danych.

+0

-1, ponieważ ta odpowiedź jest bezużyteczna na własną rękę. Rozwiń odpowiedź, podsumowując treść linku, na wypadek gdyby link przestał być ważny w przyszłości. – axiopisty

0

Dzięki Nigel

My SQL nie jest tak elegancki jak mógłby być, ale potrzebne rozwiązanie, które wymagane SQL tylko, nie plsql lub TSQL, więc skończyło się patrząc tak:

SELECT CUSTOMER, CUSTOMER_ID, COUNT(PRODUCT) PROD_COUNT, 
     RTRIM( 
      XMLAGG(XMLELEMENT (C, PRODUCT || ',') ORDER BY PRODUCT 
).EXTRACT ('//text()'), ',' 
     ) AS PRODUCTS FROM  (
     SELECT DISTINCT CUSTOMER, CUSTOMER_ID, PRODUCT 
     FROM  MAGIC_TABLE 
     ) GROUP BY CUSTOMER, CUSTOMER_ID ORDER BY 1 , 2 

Nadal nie jestem do końca pewien, co dokładnie robią funkcje XML, ale zagłębię się, kiedy nadejdzie taka potrzeba.

10

myślę LISTAGG jest najlepszy agregat grupa według funkcji do wykorzystania w tej sytuacji:

SELECT CUSTOMER, CUSTOMER_ID, 
     LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT) 
    FROM SOME_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID 
ORDER BY 1, 2 
+2

LISTAGG nie jest dostępny w 10g. –

+0

Jest to świetny sposób, aby uzyskać dokładnie to, co chciałem –

+0

'code'SELECT SPACENAME, LISTAGG (DISPLAY_NAME, '') w ramach grupy (ORDER BY SPACENAME) OD (SELECT s.SPACENAME, u.username, cu .DISPLAY_NAME z pomieszczeń s dołącz SPACEPERMISSIONS P nA s.SPACEID = p.SPACEID dołącz user_mapping u nA p.PERMUSERNAME = u.user_key przyłączenia CWD_USER Cu na u.username = cu.LOWER_USER_NAME GDZIE p.PERMTYPE = "USTAWIENIA_PLATNOŚCI" I s.SPACENAME NIE TAKIEGO "% (%" ) GROUP BY SPACENAME ZAMÓW PRZEZ SPACENAME; 'code' – anthos

3

Użytkownik Oracle funkcja „wm_concat” działa tak samo jak LISTAGG chyba nie można określić separator „” przez domyślna lub kolejność sortowania. Jest jednak zgodny z 10g.

Powiązane problemy