كيف يمكنني وضع العديد من تحديد البيانات في أعمدة مختلفة

StackOverflow https://stackoverflow.com/questions/2450810

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top