2017-04-03 40 views
2

enter image description here你好,我是初学者,我需要一些帮助,我在SQL数据库PostgreSQL的需要,使总的行

SELECT round(SUM(Cena)::NUMERIC,2) AS CelkovaCena, a.Meno, a.Priezvisko,Nazov 
FROM Predstavenie 
JOIN Autor a ON Predstavenie.ID_Autor = a.ID_Autor 
WHERE a.Meno = 'Juraj' AND a.Priezvisko = 'Klein' 
GROUP BY a.Meno,a.Priezvisko,Nazov; 

有这样的代码这是我得到我后运行该SELECT。

2.2 | Juraj | Klein | Po východe slnka 
5.4 | Juraj | Klein | Ako išiel Ferenc po hlavnej 
0.5 | Juraj | Klein | Protialkoholické hnutie Klein Ferenc PHKF 

我需要从col“cena”下面的总行。我需要有这样的事情。

2.2 | Juraj | Klein | Po východe slnka 
5.4 | Juraj | Klein | Ako išiel Ferenc po hlavnej 
0.5 | Juraj | Klein | Protialkoholické hnutie Klein Ferenc PHKF 
8.1 |      |       |  

Rollup似乎不工作,因为群体。我在网上查找了各种解决方案,但没有一个能起作用......谢谢。

+0

当你尝试'rollup'时会发生什么? –

回答

3

使用GROUPING SETS

SELECT round(SUM(Cena)::NUMERIC,2) AS CelkovaCena, a.Meno, 
     a.Priezvisko, Nazov 
FROM Predstavenie p JOIN 
    Autor a 
    ON p.ID_Autor = a.ID_Autor 
WHERE a.Meno = 'Juraj' AND a.Priezvisko = 'Klein' 
GROUP BY GROUPING SETS ((a.Meno, a.Priezvisko, Nazov),()); 

这就好比ROLLUP但它可以让你明确地列出你想要的汇总行。

在快速的方式

SELECT round(SUM(Cena)::NUMERIC,2) AS CelkovaCena, a.Meno, a.Priezvisko,Nazov 
FROM Predstavenie 
JOIN Autor a ON Predstavenie.ID_Autor = a.ID_Autor 
WHERE a.Meno = 'Juraj' AND a.Priezvisko = 'Klein' 
GROUP BY a.Meno,a.Priezvisko,Nazov 
union all 
SELECT round(SUM(Cena)::NUMERIC,2) AS CelkovaCena,null as Meno,null as Nazov 
FROM Predstavenie 
JOIN Autor a ON Predstavenie.ID_Autor = a.ID_Autor 
WHERE a.Meno = 'Juraj' AND a.Priezvisko = 'Klein' 

,但更好的方法

0

是创造新的查询,如果你把这个在子查询计算总

0

结合WITHUNION可以得到你所需要的。

WITH subq AS (SELECT round(SUM(Cena)::NUMERIC,2) AS CelkovaCena, a.Meno, a.Priezvisko,Nazov 
FROM Predstavenie 
JOIN Autor a ON Predstavenie.ID_Autor = a.ID_Autor 
WHERE a.Meno = 'Juraj' AND a.Priezvisko = 'Klein' 
GROUP BY a.Meno,a.Priezvisko,Nazov) 
SELECT * FROM subq 
UNION 
SELECT SUM(CelkovaCena), '', '', '' FROM subq; 

这可以节省您不必要的两次结果并减慢速度。只要确保每个SELECT具有与第一个相同的列数和类型。