0

I am extracting the same informations from three different tables: I need to get all the data in one table grouping the results as in each single query. The query I wrote is the following:

SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(totali) FROM 
SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali FROM fatture, fa_ce_ca,centri_costoricavo, movimenti WHERE fatture.esercizio=3 AND fatture.id_fa=fa_ce_ca.id_fa AND centri_costoricavo.id=fa_ce_ca.centro AND movimenti.id=fa_ce_ca.caus GROUP BY fa_ce_ca.caus AS fatture 
UNION SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali FROM mov_banca,centri_costoricavo, movimenti,esercizi WHERE centri_costoricavo.id=mov_banca.centro AND movimenti.id=mov_banca.tipo AND mov_banca.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_banca.per=2 GROUP BY mov_banca.tipo AS mov_banca 
UNION SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali FROM mov_cassa,centri_costoricavo, movimenti,esercizi WHERE centri_costoricavo.id=mov_cassa.centro AND movimenti.id=mov_cassa.tipo AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_cassa.per=2 GROUP BY mov_cassa.tipo) AS mov_cassa 
GROUP BY movimenti.movimento

Trying to execute the query I get the following error: "... the right syntax to use near 'AS mov_banca UNION (S...". After hours banging my head against the wall I can't see what I am doing wrong. Any help?

Thanks in advance! Lelio

4

2 回答 2

0

去掉每个联合中 SELECT 查询周围的括号。正确的语法是:

SELECT <column-list>
FROM {<table>|<derived-table>} [[AS] <alias>]
[UNION [ALL]
 SELECT <column-list>
 FROM {<table>|<derived-table>} [[AS] <alias>]
]*

请注意,派生表子查询周围仍然需要括号,而不是联合的部分。

此外,在尝试格式化您的查询时,看起来您在括号和子查询中发生了有趣的事情。我相信你想要工会的总和,而且很可能想要 aUNION ALL不是a UNION。您还需要从整个派生表子查询中进行选择(我已经X在下面的示例中命名了它)

因此,您的查询应该(可能)是:

SELECT X.descrizione, X.movimento, sum(totali) 
FROM (
    SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali 
    FROM fatture, fa_ce_ca,centri_costoricavo, movimenti 
    WHERE fatture.esercizio=3 
    AND fatture.id_fa=fa_ce_ca.id_fa 
    AND centri_costoricavo.id=fa_ce_ca.centro 
    AND movimenti.id=fa_ce_ca.caus 
    GROUP BY fa_ce_ca.caus
    UNION ALL
    SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali 
    FROM mov_banca,centri_costoricavo, movimenti,esercizi 
    WHERE centri_costoricavo.id=mov_banca.centro 
    AND movimenti.id=mov_banca.tipo 
    AND mov_banca.data BETWEEN esercizi.start AND esercizi.end 
    AND esercizi.id=3 
    AND mov_banca.per=2 
    GROUP BY mov_banca.tipo
    UNION ALL
    SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali 
    FROM mov_cassa,centri_costoricavo, movimenti,esercizi 
    WHERE centri_costoricavo.id=mov_cassa.centro 
    AND movimenti.id=mov_cassa.tipo 
    AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end 
    AND esercizi.id=3 
    AND mov_cassa.per=2 
    GROUP BY mov_cassa.tipo
) AS X
GROUP BY X.movimento

尽管您仍然非常奇怪的(阅读:MySQL-only、hackish、难以理解且坦率地无法预测)GROUP BY,并且您选择使用“旧”JOIN 语法会使您的查询更难阅读。

于 2013-09-19T16:28:56.370 回答
0

我接受了您的查询并将其格式化为

SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(totali) 
FROM ( (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali 
        FROM fatture, fa_ce_ca,centri_costoricavo, movimenti 
        WHERE fatture.esercizio=3 AND fatture.id_fa=fa_ce_ca.id_fa AND centri_costoricavo.id=fa_ce_ca.centro AND movimenti.id=fa_ce_ca.caus 
        GROUP BY fa_ce_ca.caus
       ) AS fatture 
       UNION 
       (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali 
        FROM mov_banca,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_banca.centro AND movimenti.id=mov_banca.tipo AND mov_banca.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_banca.per=2 
        GROUP BY mov_banca.tipo
       ) AS mov_banca 
       UNION
      (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali 
        FROM mov_cassa,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_cassa.centro AND movimenti.id=mov_cassa.tipo AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_cassa.per=2 
       GROUP BY mov_cassa.tipo) AS mov_cassa
      ) 
GROUP BY movimenti.movimento

看来你少了一个括号...

SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(totali) 
--
-- 2 opening parenthesis.
--
FROM ( (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali 
        FROM fatture, fa_ce_ca,centri_costoricavo, movimenti 
        WHERE fatture.esercizio=3 AND fatture.id_fa=fa_ce_ca.id_fa AND centri_costoricavo.id=fa_ce_ca.centro AND movimenti.id=fa_ce_ca.caus 
        GROUP BY fa_ce_ca.caus
       ) AS fatture 
       UNION 
       (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali 
        FROM mov_banca,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_banca.centro AND movimenti.id=mov_banca.tipo AND mov_banca.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_banca.per=2 
        GROUP BY mov_banca.tipo
       ) AS mov_banca 
       UNION
      (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali 
        FROM mov_cassa,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_cassa.centro AND movimenti.id=mov_cassa.tipo AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_cassa.per=2 
       GROUP BY mov_cassa.tipo) AS mov_cassa
      ) 
   ) temp   --   <----------------  Is it missing ?
GROUP BY temp.movimento
于 2013-09-19T16:31:47.927 回答