كيف يمكنني وضع العديد من تحديد البيانات في أعمدة مختلفة
-
20-09-2019 - |
سؤال
ولدي أساسا 7 عبارات مختارة أنني بحاجة إلى إخراج النتائج في أعمدة منفصلة. عادة أود أن استخدام جدولي لذلك ولكن أنا بحاجة إلى وسيلة سريعة وفعالة للذهاب نحو هذا كما أن هناك أكثر من 7 مليارات الصفوف في الجدول. أنا أستخدم نظام قاعدة البيانات vertica. فيما يلي مثال من تصريحاتي:
SELECT COUNT(user_id) AS '20100101' FROM event_log_facts WHERE date_dim_id=20100101
SELECT COUNT(user_id) AS '20100102' FROM event_log_facts WHERE date_dim_id=20100102
SELECT COUNT(user_id) AS '20100103' FROM event_log_facts WHERE date_dim_id=20100103
SELECT COUNT(user_id) AS '20100104' FROM event_log_facts WHERE date_dim_id=20100104
SELECT COUNT(user_id) AS '20100105' FROM event_log_facts WHERE date_dim_id=20100105
SELECT COUNT(user_id) AS '20100106' FROM event_log_facts WHERE date_dim_id=20100106
SELECT COUNT(user_id) AS '20100107' FROM event_log_facts WHERE date_dim_id=20100107
ويجب أن تعود شيئا مثل:
20100101 | 20100102 | 20100103 | 20100104 | 20100105 | 20100106 | 20100107
1234 | 1234 | 36564 | 45465 | 356754 | 3455 | 4556675
المحلول
هل يمكن استخدام سلسلة من الاستفسارات unioned معا. نوع من القبيح، ولكن ينبغي لها أن تعمل
SELECT
COUNT(user_id) AS '20100101'
,NULL AS '20100102'
,NULL AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100101
UNION
SELECT
NULL AS '20100101'
,COUNT(user_id) AS '20100102'
,NULL AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100102
UNION
SELECT
NULL AS '20100101'
,NULL AS '20100102'
,COUNT(user_id) AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100103
وETC ...
نصائح أخرى
والتفاف عليها بين قوسين، إضافة الفواصل وحدد لهم:)
SELECT
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100101) AS '20100101',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100102) AS '20100102',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100103) AS '20100103',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100104) AS '20100104',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100105) AS '20100105',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100106) AS '20100106',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100107) AS '20100107'
وأو هل يمكن أن تجعل وظيفة العددية التي تأخذ كمعلمة في date_dim_id والعوائد على النتيجة التي تريدها، والذي يطلق عليه عدة مرات .. (<م> إذا كان لديك DB يدعم نظام وظائف العددية م>)
SELECT
COUNT(date_dim=20100101 OR NULL) AS '20100101',
COUNT(date_dim=20100102 OR NULL) AS '20100102',
...
FROM event_log_facts
حسنا، النظر في استخدام الجدول المحوري. ومن أكثر EyeCandy:)
أولا الاتحاد نتائجك، من محور ذلك!
وهيريس المثال الخاص بك، وهنا وSQLFiddle -> http://sqlfiddle.com/# ! 6 / d41d8 / 6440
SELECT PivT.*
FROM
(
SELECT 10 As Quantity, '20100101' AS DateDim
UNION
SELECT 21 , '20100102'
UNION
SELECT 3 , '20100103'
UNION
SELECT 41 , '20100104'
UNION
SELECT 50 , '20100105'
UNION
SELECT 26 , '20100106'
UNION
SELECT 78 , '20100107'
) T
PIVOT (avg(Quantity) for DateDim in ([20100101],
[20100102],
[20100103],
[20100104],
[20100105],
[20100106],
[20100107])
) As PivT