我从三个不同的表中提取相同的信息:我需要在一个表中获取所有数据,将结果分组为每个单个查询。我写的查询如下:
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
尝试执行查询我收到以下错误:“...在'AS mov_banca UNION(S ......)附近使用正确的语法。几个小时后我的头靠在墙上我看不清楚我是什么我做错了。有什么帮助吗?
提前致谢! Lelio
答案 0 :(得分:0)
删除每个联合中SELECT查询周围的括号。正确的语法是:
SELECT <column-list>
FROM {<table>|<derived-table>} [[AS] <alias>]
[UNION [ALL]
SELECT <column-list>
FROM {<table>|<derived-table>} [[AS] <alias>]
]*
请注意,您仍然需要围绕 derived-table子查询的括号,而不是联合的部分。
此外,在尝试格式化查询时,看起来你的括号和子查询都有趣。我相信你想要工会的总和,也很可能想要一个UNION ALL
和而不是一个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,hackish,很难理解,坦率地说无法预测)GROUP BY
和您选择使用“旧”JOIN语法使您的查询更难阅读。
答案 1 :(得分: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