2011-11-18 110 views
3

我苦苦寻找的远离这2个查询组合...香港专业教育学院试图subquerys,连接,联合和有没有运气:(结合的MySQL查询

查询

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 | 
+------------+----------+---------+ 

查询乙

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 | 
+------------+----------+---------+----------+ 

将不胜感激任何帮助。

谢谢。

回答

0

使用

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' 
+0

谢谢大家对你的帮助是非常非常感谢,并与** Yahia的**版本,因为它给了我最大的灵活性。 – mybigman

+0

@mybigman欢迎您:-)请不要忘记将upvote/mark标记为已接受任何有帮助的答案(请参阅http://meta.stackexchange.com/questions/5234/how-does-accepting-an-回答工作)。 – Yahia

0

如何

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

我相信这将工作运行:

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 
2

一种可能的方式

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

我只是在那里......但是,如果且仅当单一日期才有效...... – DRapp

0

它实际上并不难(一旦你已经做了一段时间)。使用SUM(IF()),如...

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 

这也将工作,如果你扩展了双方建立和恢复的日期范围...