تبديل النتائج مع Oracle
سؤال
سؤالي هو ، ببعض الخلفية:
لا بد لي من إنشاء بعض استعلامات SQL بناءً على بيانات تعريف الجدول (تنسيق العمود) ، والنتيجة هي شيء مثل:
TABLENAME1|COL1
TABLENAME1|COL2
TABLENAME2|COL1
TABLENAME2|COL2
TABLENAME2|COL3
TABLENAME3|COL1
TABLENAME4|COL1
TABLENAME4|COL2
... /*some other 1800 rows */
(نعم ، يتم طلب ذلك.) ما أحتاجه هو تحويل هذه البيانات ، بناءً على العمود الأول ، وبالتالي فإن الإخراج المتوقع سيكون:
TABLENAME1|COL1|COL2|NULL
TABLENAME2|COL1|COL2|COL3
TABLENAME3|COL1|NULL|NULL
TABLENAME4|COL1|COL2|NULL
/* less then 1800 rows ;-) */
هل من الممكن استخدام Oracle SQL؟
شكرا لك مقدما!
المحلول
إذا كنت ترغب في إنشاء الاستعلام لكل مكالمة أو استخدام عداد أقصى مشفر ، فيمكنك القيام بشيء من هذا القبيل:
WITH tab AS
(
SELECT table_name, column_name FROM user_tab_cols WHERE column_id <= 4
) -- user_tab_cols used to provide test data, use your table instead
SELECT MAX(c1) c1,
MAX(c2) c2,
MAX(c3) c3,
MAX(c4) c4
FROM (SELECT table_name,
DECODE( column_id, 1, column_name ) c1,
DECODE( column_id, 2, column_name ) c2,
DECODE( column_id, 3, column_name ) c3,
DECODE( column_id, 4, column_name ) c4
FROM ( SELECT table_name,
column_name,
ROW_NUMBER() OVER ( PARTITION BY table_name ORDER BY column_name ) column_id
FROM tab
)
)
GROUP BY table_name
ORDER BY table_name
إذا كان كافياً للحصول عليه في هذا النموذج
TABLENAME1|COL1,COL2
TABLENAME2|COL1,COL2,COL3
ألق نظرة على توم كيت Stragg.
نصائح أخرى
الكلمة الرئيسية التي تبحث عنها هي pivot
. هنا مثال على استخدامه. يظهر بناء الجملة بشكل عام مثل MSSQL ، وبما أنني لا أعرف عنوان URL لوثائق Oracle سأرمي MSDN اربط ونأمل أن يقوم شخص يعرف المزيد عن تخطيط صفحة Oracle أكثر مني بتحريره للإشارة إلى وثائقه.
تعديل: Oracle Documentation, ، ابحث عن Pivot مرات كافية وستصل إلى التفاصيل.