SQL - قيم متعددة مفصولة بفواصل عند استخدام GROUP BY [نسخة مكررة]

StackOverflow https://stackoverflow.com/questions/234532

  •  04-07-2019
  •  | 
  •  

سؤال

لدي البيانات التي تبدو

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

أرغب في كتابة استعلام يجعل البيانات تبدو كما يلي:

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

باستخدام Oracle 10g إذا كان ذلك مفيدًا.لقد رأيت شيئًا من شأنه أن يعمل باستخدام MYSQL، ولكنني بحاجة إلى ما يعادله من SQL أو ORACLE.لقد رأيت أيضًا أمثلة على العمليات المخزنة التي يمكن إنشاؤها، ومع ذلك، لا يمكنني استخدام عملية مخزنة مع المنتج الذي أستخدمه.

إليك كيفية العمل في MySQL إذا كنت أستخدمه

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

شكرًا لك.

هل كانت مفيدة؟

المحلول

هذا الرابط يشير إلى عدد من الأمثلة للطرق المختلفة للقيام بذلك على Oracle.معرفة ما إذا كان هناك شيء لديك أذونات في قاعدة البيانات الخاصة بك للقيام به.

نصائح أخرى

أعتقد أن LISTAGG هي أفضل مجموعة مجمعة حسب الوظيفة لاستخدامها في هذه الحالة:

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

تعمل وظيفة مستخدم Oracle 'wm_concat' بنفس الطريقة التي تعمل بها LISTAGG باستثناء أنه لا يمكنك تحديد محدد '،' بشكل افتراضي أو ترتيب فرز.ومع ذلك فهو متوافق مع 10 جرام.

شكرا نايجل،

إن لغة SQL الخاصة بي ليست أنيقة بقدر الإمكان، لكنني كنت بحاجة إلى حل يتطلب لغة SQL فقط، وليس PLSQL أو TSQL، لذلك انتهى الأمر بالظهور على النحو التالي:

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

ما زلت غير متأكد تمامًا مما تفعله وظائف XML بالضبط، ولكنني سأتعمق أكثر عند الحاجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top