我有这个简单的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。
我有这个简单的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。
你可以只选择一个单列为一个常数,然后将其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行,每行都有一个额外的“你的常量“列看起来很有趣 - 但是,我得到以下错误:#1248 - 每个派生表都必须具有自己的别名 – 2012-02-14 15:38:51
@Homer_J - 我在连接表后面忘记了一个别名;我已经更新了我的答案来解决这个问题。 – 2012-02-14 15:42:18
我不是绝对肯定的,但这种情况下的声明可能工作。我无法测试它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
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 )
总是会返回一个行怎么一回事,因为第二部分。
为什么你希望它返回一行,如果它正确地返回一个没有,该行应该包含什么? – JohnCambell 2012-02-14 15:17:55
返回NULL将会很好。 – 2012-02-14 15:20:30