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:
sqlSELECT
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
لحساب عدد القيم في كل مجموعة. إليك كيفية تنفيذ ذلك:
sqlSELECT
A,
COUNT(B) AS B_count
FROM
your_table
GROUP BY
A;
هذا الاستعلام سيعطيك الإخراج المطلوب بشكل مباشر:
cssA B_count
1 3
2 2
3 2
إذا كنت بحاجة إلى إظهار القيم الموجودة في العمود B بجانب العمود A في الإخراج، يمكنك استخدام الاستعلام التالي:
sqlSELECT
A,
LISTAGG(B, ',') WITHIN GROUP (ORDER BY B) AS B_values,
COUNT(B) AS B_count
FROM
your_table
GROUP BY
A;
هذا سينتج النتيجة التالية:
cssA B_values B_count
1 100,102,105 3
2 100,105 2
3 100,102 2
يرجى ملاحظة أن دالة LISTAGG
تم جلبها إلى Oracle في الإصدار 11.2، لذا تأكد من أن النسخة التي تستخدمها تدعم هذه الدالة.