2012-02-14 54 views
1

我有这个简单的MySQL声明:MySQL的功能,必须带回一排

SELECT 
    ((AVG(q1) + AVG(q8) + AVG(q15))/3) AS Res 
FROM tresults 
WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
GROUP BY q25 

现在,如果有与MARCH2010,则查询返回结果为零的日期(这是正确的)无行,但我希望它返回一行 - 即使结果是NULL

+0

为什么你希望它返回一行,如果它正确地返回一个没有,该行应该包含什么? – JohnCambell 2012-02-14 15:17:55

+0

返回NULL将会很好。 – 2012-02-14 15:20:30

回答

1

你可以只选择一个单列为一个常数,然后将其left join到结果集:

select l.*, r.* 
from (select "your constant" as constant) as l 
left join ( 
    SELECT 
    ((AVG(q1) + AVG(q8) + AVG(q15))/3) AS Res 
    FROM tresults 
    WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
    GROUP BY q25 
) as r on 1 

这是如何工作的:

  • select "your constant" as constant总是返回单行
  • left join总是返回left表中的所有行至少一次
  • 如果right表没有行,那么整个left表扩展了一堆空列,结果有一行
  • 如果right表有n行,结果有n行,每行都有一个额外的“你的常量“列
+0

看起来很有趣 - 但是,我得到以下错误:#1248 - 每个派生表都必须具有自己的别名 – 2012-02-14 15:38:51

+0

@Homer_J - 我在连接表后面忘记了一个别名;我已经更新了我的答案来解决这个问题。 – 2012-02-14 15:42:18

0

我不是绝对肯定的,但这种情况下的声明可能工作。我无法测试它atm。

Case When 
    (SELECT 
    Count(*) 
    FROM tresults 
    WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
    GROUP BY q25) > 0 
Then 
    SELECT 
    ((AVG(q1) + AVG(q8) + AVG(q15))/3) AS Res 
    FROM tresults 
    WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
    GROUP BY q25 
Else 
    SELECT null 
End 
0

SELECT ((AVG(Q1)+ AVG(Q8)+ AVG(Q15))/ 3)AS RES
FROM tresults WHERE ID = '1' AND日期= 'MARCH2010' AND Q25 = '1' GROUP BY Q25

UNION ALL

SELECT NULL AS RES FROM双 WHERE NOT EXISTS( SELECT ((AVG(Q1)+ AVG(Q8)+ AVG(Q15))/3)AS Res
FROM tresults WHERE ID = '1' 和日期= 'MARCH2010' AND Q25 = '1' GROUP BY Q25 )

总是会返回一个行怎么一回事,因为第二部分。