SQL - قيم متعددة مفصولة بفواصل عند استخدام 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
أرغب في كتابة استعلام يجعل البيانات تبدو كما يلي:
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 بالضبط، ولكنني سأتعمق أكثر عند الحاجة.