SQL:在TEMP表中使用UNION

时间:2016-12-08 05:31:07

标签: mysql

  

课程问题所以请不要给我答案!

我正在尝试将去年销售额与今年的销售额进行比较,而我正在使用的方法是使用临时表,其中包含由联合加入的2个Select语句

SELECT theatreNo,  SUM(lastMay) AS lastMay, SUM(thisMay) AS thisMay
FROM(
    SELECT
    theatreNo,
    COUNT(*) AS lastMay
    FROM Hospital_Operation
    WHERE year(startDateTime) = '2015' and month(startDateTime) = '05' 
    GROUP BY theatreNo, DATE_FORMAT(startDateTime, '%d%c%y')
    UNION ALL
    SELECT
    theatreNo,
    COUNT(*) AS thisMay
    FROM Hospital_Operation
    WHERE year(startDateTime) = '2016' and month(startDateTime) = '05' 
    GROUP BY theatreNo, DATE_FORMAT(startDateTime, '%d%c%y')
)AS Temp
GROUP BY theatreNo;

我收到错误:字段名称

中的未知列“thismay”

有人可以向我解释为什么我会收到此错误吗?我理解的方式是我加入表并将其存储在TEMP表中。

1 个答案:

答案 0 :(得分:1)

首先,在这里给你一个方法。

SELECT theatreNo,  SUM(lastMay) AS lastMay, SUM(thisMay) AS thisMay
FROM(
    SELECT
    theatreNo,
    COUNT(*) AS lastMay,
    0 AS thisMay
    FROM Hospital_Operation
    WHERE year(startDateTime) = '2015' and month(startDateTime) = '05' 
    GROUP BY theatreNo, DATE_FORMAT(startDateTime, '%d%c%y')
    UNION ALL
    SELECT
    theatreNo,
    0 AS lastMay,
    COUNT(*) AS thisMay
    FROM Hospital_Operation
    WHERE year(startDateTime) = '2016' and month(startDateTime) = '05' 
    GROUP BY theatreNo, DATE_FORMAT(startDateTime, '%d%c%y')
)AS Temp
GROUP BY theatreNo;

然后让我们做一些解释:

Temp查询中,您使用了UNION ALL,第一个查询将决定此查询结果中的列名,因此temp仅生成列theatreNo }和lastMay,然后在第二个查询中,thisMay将被第一个查询lastMay覆盖,因此当您在外部查询中选择列thisMay时,它造成 未知列"这可能"

以下是关于UNION的官方文档:

  

第一个SELECT语句中的列名用作返回结果的列名。在每个SELECT语句的相应位置中列出的选定列应具有相同的数据类型。 (例如,第一个语句选择的第一列应该与其他语句选择的第一列具有相同的类型。)