Возможно ли объединение (наборы результатов) "двух запросов с агрегатом и группой по"? - PullRequest
2 голосов
/ 22 сентября 2010

1

Select id,count(*) as totalX FROM my_table WHERE x_factor = 1 GROUP BY id

Набор результатов :

 id        totalX
 --------- --------------
         9             34
        10              6
        11             21
        12              3  

2

Select id,count(*) as totalY FROM my_table WHERE y_factor = 1 GROUP BY id

Набор результатов 2:

 id        totalY
 --------- --------------
         9             334
        10              56
        11             251
        12              93 

Есть ли способ, которым я могу достичь этого:

 id        totalX        totalY         
 --------- --------------  --------------  
         9             34              334 
        10              6               56 
        11             21              251 
        12              3               93 

Я хотел бы получить решение для Sybase 12.5 на RHEL 5, также я хотел бы знатьесли это возможно в любой другой системе баз данных.

--- спасибо за ответ (ы) -

Comparing EXECUTION TIME: (For a certain query) 
 Query 1:
Execution Time 61.
SQL Server cpu time: 6100 ms.  SQL Server elapsed time: 12133 ms.

Query 2:
Execution Time 53.
SQL Server cpu time: 5300 ms.  SQL Server elapsed time: 12090 ms.

Query X(1+2):
Execution Time 84.
SQL Server cpu time: 8400 ms.  SQL Server elapsed time: 21456 ms.

Ответы [ 3 ]

4 голосов
/ 22 сентября 2010

Используя CASE / WHEN для столбца и суммируя 1 или 0 на основе true / false, вы можете получить оба в одном и том же запросе ... Кроме того, вы можете сделать то же самое, если хотите получить сумму некоторых значение в другом столбце ... просто замените его истинным значением вместо 1.

select 
      id,
      sum( CASE WHEN x_factor = 1 THEN 1 ELSE 0 END ) as X_Count, 
      sum( CASE WHEN y_factor = 1 THEN 1 ELSE 0 END ) as Y_Count
  from
      yourTable
  group by
      id
1 голос
/ 23 октября 2010

CASE ... {0 | 1} - хороший трюк для людей, чтобы знать, но я думаю, что проблема может быть проще, чем это.Вы пробовали:

SELECT id, COUNT(x_factor) AS count_x, COUNT(y_factor) AS count_y FROM my_table GROUP BY id

1 голос
/ 22 сентября 2010

Это должно работать:

SELECT id, 
       sum(case when x_factor = 1 then 1 else 0 end) as totalX,
       sum(case when y_factor = 1 then 1 else 0 end) as totalY
    FROM my_table 
    WHERE x_factor = 1 
        OR y_factor = 1
    GROUP BY id
...