Объединить запросы MySQL - PullRequest
       9

Объединить запросы MySQL

3 голосов
/ 18 ноября 2011

Я изо всех сил пытаюсь найти способ объединить эти 2 запроса ... Я пробовал подзапросы, объединения, объединения и не повезло: (

Запрос A

SELECT DATE(crtdtime) AS cntldate, sd_class, COUNT(crtdtime) AS created
FROM master
WHERE DATE(crtdtime) = '2011-11-16'
GROUP BY cntldate, sd_class

, который производит

+------------+----------+---------+
| cntldate   | sd_class | created |
+------------+----------+---------+
| 2011-11-16 | CUST     |    2226 |
| 2011-11-16 | NET      |     238 |
+------------+----------+---------+

Запрос B

SELECT DATE(rstdtime) AS cntldate, sd_class, COUNT(rstdtime) AS restored
FROM master
WHERE DATE(rstdtime) = '2011-11-16'
GROUP BY cntldate, sd_class

, который производит

+------------+----------+----------+
| cntldate   | sd_class | restored |
+------------+----------+----------+
| 2011-11-16 | CUST     |     2315 |
| 2011-11-16 | NET      |      221 |
+------------+----------+----------+

Но хотелось бы, чтобы конечный результат был ...

+------------+----------+---------+----------+
| cntldate   | sd_class | created | restored |
+------------+----------+---------+----------+
| 2011-11-16 | CUST     |    2226 |     2315 |
| 2011-11-16 | NET      |     238 |      221 |
+------------+----------+---------+----------+

Буду очень признателен за любую помощь.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 18 ноября 2011

один из возможных способов

SELECT DATE(crtdtime) AS cntldate, 
  sd_class, 
  sum( DATE(crtdtime) = '2011-11-16') AS created
  sum( DATE(rstdtime) = '2011-11-16') AS restored
FROM master
WHERE DATE(crtdtime) = '2011-11-16' or DATE(rstdtime) = '2011-11-16'
GROUP BY cntldate, sd_class
0 голосов
/ 18 ноября 2011

Это на самом деле не так уж сложно (если вы делаете это некоторое время).Используйте СУММУ (ЕСЛИ ()), например ...

SELECT 
      date( if( date( ctrdtime ) = '2011-11-16', ctrdtime, rstdtime )) as CntlDate,
      sd_class,
      sum( if( date( ctrdtime ) = '2011-11-16', 1, 0 ) ) as CreatedCount,
      sum( if( date( rstdtime ) = '2011-11-16', 1, 0 ) ) as RestoredCount
   FROM 
      master
   WHERE 
         DATE(crtdtime) = '2011-11-16'
      OR DATE(rstdtime) = '2011-11-16'
   GROUP BY 
      1, 2

Это также будет работать, если вы расширили диапазон дат как для созданного, так и для восстановленного ...

0 голосов
/ 18 ноября 2011

Как насчет

select q1.cntldate, q1.sd_class, q1.created, q2.restored 
   from  (
   SELECT DATE(crtdtime) AS cntldate, sd_class, COUNT(crtdtime) AS created
      FROM master
      WHERE DATE(crtdtime) = '2011-11-16'
      GROUP BY cntldate, sd_class
   )  q1
   inner join (
      SELECT DATE(rstdtime) AS cntldate, sd_class, COUNT(rstdtime) AS restored
         FROM master
         WHERE DATE(rstdtime) = '2011-11-16'
         GROUP BY cntldate, sd_class
  ) q2
      on q1.cntldate=q2.cntldate and q1.sdclass = q2.sdclass

Это синтаксис Postgres, поэтому, возможно, придется поиграть с ним, чтобы запустить его с MySql

0 голосов
/ 18 ноября 2011

Я считаю, что это будет работать:

SELECT DATE(m1.crtdtime) AS cntldate, 
m1.sd_class, 
COUNT(m1.crtdtime) AS created , 
(
  SELECT COUNT(m2.rstdtime) 
  FROM master m2
  WHERE DATE(m2.rstdtime) = DATE(m1.rstdtime)
  and m2.sd_class=m1.sd_class
) as restored
FROM master m1
WHERE DATE(crtdtime) = '2011-11-16'
GROUP BY cntldate, sd_class
0 голосов
/ 18 ноября 2011

использование

SELECT C.cntldate, C.sd_class, C.created, R.restored
FROM
(
SELECT DATE(crtdtime) AS cntldate, sd_class, COUNT(crtdtime) AS created
FROM master
GROUP BY cntldate, sd_class
) C
INNER JOIN
(
SELECT DATE(rstdtime) AS cntldate, sd_class, COUNT(rstdtime) AS restored
FROM master
GROUP BY cntldate, sd_class
) R
ON R.cntldate = C.cntldate AND R.sd_class = C.sd_class
WHERE C.cntldate = '2011-11-16' AND R.cntldate = '2011-11-16'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...