البرمجة

جمع وعد الصفوف في أوراكل

To achieve the desired output, you can use the LISTAGG function in Oracle along with the GROUP BY clause. However, since you mentioned that LISTAGG didn’t work for you, you can achieve the same result by using a subquery and the SYS_CONNECT_BY_PATH function. Here’s how you can do it:

sql
SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(A, ',')) KEEP (DENSE_RANK LAST ORDER BY curr), ',') AS A_combinations, COUNT(B) AS B_count FROM (SELECT A, B, ROW_NUMBER() OVER (PARTITION BY A ORDER BY A) AS curr, ROW_NUMBER() OVER (PARTITION BY A ORDER BY A) -1 AS prev FROM your_table) START WITH curr = 1 CONNECT BY prev = PRIOR curr AND A = PRIOR A GROUP BY A;

This query uses the SYS_CONNECT_BY_PATH function to concatenate the values of column A. The ROW_NUMBER function is used to create a unique identifier for each row within each group of column A. The START WITH and CONNECT BY clauses are used to define the hierarchical relationship between the rows. Finally, the GROUP BY clause is used to group the results by column A and calculate the count of column B for each group.

المزيد من المعلومات

يمكنك استخدام دالة LISTAGG في أوراكل لجمع القيم في العمود B معًا مع فاصل محدد، ثم استخدام دالة COUNT لحساب عدد القيم في كل مجموعة. إليك كيفية تنفيذ ذلك:

sql
SELECT A, COUNT(B) AS B_count FROM your_table GROUP BY A;

هذا الاستعلام سيعطيك الإخراج المطلوب بشكل مباشر:

css
A B_count 1 3 2 2 3 2

إذا كنت بحاجة إلى إظهار القيم الموجودة في العمود B بجانب العمود A في الإخراج، يمكنك استخدام الاستعلام التالي:

sql
SELECT A, LISTAGG(B, ',') WITHIN GROUP (ORDER BY B) AS B_values, COUNT(B) AS B_count FROM your_table GROUP BY A;

هذا سينتج النتيجة التالية:

css
A B_values B_count 1 100,102,105 3 2 100,105 2 3 100,102 2

يرجى ملاحظة أن دالة LISTAGG تم جلبها إلى Oracle في الإصدار 11.2، لذا تأكد من أن النسخة التي تستخدمها تدعم هذه الدالة.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!