Как мне поместить несколько инструкций Select в разные столбцы

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

  •  20-09-2019
  •  | 
  •  

Вопрос

В основном у меня есть 7 операторов select, которые мне нужны для вывода результатов в отдельные столбцы.Обычно я бы использовал для этого перекрестную таблицу, но мне нужен быстрый и эффективный способ сделать это, поскольку в таблице более 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
Это было полезно?

Решение

Вы могли бы использовать серию запросов, объединенных вместе.Немного некрасиво, но это должно сработать

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  

И т.д...

Другие советы

заключите их в круглые скобки, добавьте запятые и выделите их :)

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 и возвращает нужный вам результат, и вызвать ее несколько раз..( если ваша система базы данных поддерживает скалярные функции )

SELECT
COUNT(date_dim=20100101 OR NULL) AS '20100101',
COUNT(date_dim=20100102 OR NULL) AS '20100102',
...
FROM event_log_facts

Что ж, подумайте об использовании сводной таблицы.Это более привлекательно для глаз :)

Сначала объедините свои результаты, чем сводите их!

Вот ваш пример, и вот файл 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