Oracle count *和groupBy

时间:2013-10-02 08:56:24

标签: sql count group-by

我有以下oracle句子返回分组结果,例如一组中的10个,第二组中的8个。

我在计算它们时遇到了麻烦,因为看起来这个计数(*)作为stevilo_prosenj无法正常工作,所以如果有人可以帮助我如何获得每组中有多少结果计数,我将不胜感激。

谢谢

SELECT 
    PZB."OBD_ZA_POSILJANJE_PROSENJ_ID",
    PZB."VISOKOSOLSKO_SREDISCE_ID",
    leto.STUDIJSKO_LETO_ID,
    OBD.VRSTA_PROSNJE vrsta_prosnje_string,
    stdm.NAZIV_VRSTE_STUD_DOMOV naziv_vrste_stud_domov_ ,
    stdm.naziv naziv_stud_dom,
    SIFSTAT.OZNAKA OZNAKA_STATUSA_PROSNJE,
    count(*) as stevilo_prosenj


  FROM MSB_PROSNJE_ZA_BIVANJE PZB,
       S_OBD_POS_PRS_ZA_SUBV_VW OBD,
         S_VISOKOSOLSKO_SREDISCE_VW vss,
         S_STUDIJSKA_LETA_VW leto,
        S_STUDENTSKI_DOMOVI_VW stdm,
        MSB_SIF_STATUSOV_PROSENJ sifstat

  WHERE PZB.OBD_ZA_POSILJANJE_PROSENJ_ID = OBD.OBD_ZA_POSILJANJE_PROSENJ_ID
    AND vss.visokosolsko_sredisce_id     = pzb.visokosolsko_sredisce_id
    AND obd.studijsko_leto_id            = leto.studijsko_leto_id

GROUP BY
    PZB."OBD_ZA_POSILJANJE_PROSENJ_ID",
    PZB."VISOKOSOLSKO_SREDISCE_ID",
    leto.STUDIJSKO_LETO_ID,
    OBD.VRSTA_PROSNJE,
    stdm.NAZIV_VRSTE_STUD_DOMOV,
    stdm.naziv,
    SIFSTAT.OZNAKA

3 个答案:

答案 0 :(得分:0)

我将假设你想要一个GROUP BY,但不是所有的SELECTed列......

如果您的数据库支持它,您可以

SELECT columnA, columnB, columnC, count(*) OVER (PARTITION BY columnA, columnB)
FROM table;

否则,您必须手动选择

SELECT a.columnA, a.columnB, a.columnC, b.countResult
FROM (  SELECT columnA, columnB, columnC
        FROM table
        WHERE conditions
     ) a
JOIN
     (  SELECT columnA, columnB, count(*) AS countResult
        FROM table
        GROUP BY columnA, columnB
     ) b
ON a.columnA = b.columnA
AND a.columnB = b.columnB
/

答案 1 :(得分:0)

您在FROM语句中连接表但是S_STUDENTSKI_DOMOVI_VW stdm, MSB_SIF_STATUSOV_PROSENJ sifstat表没有连接到WHERE语句中的其他表,因此它们连接所有行,并且无条件地获得FULL JOIN,因此COUNT输出您没有预料到的结果(乘以两个表的行数)。

答案 2 :(得分:0)

我只想感谢大家的意见和帮助,我已经修复了问题,因为我不想发布我的解决方案,因为我不喜欢留下未回答的问题

计数部分给了我一些问题,我已经解决了这个问题。

(SELECT COUNT(*) FROM MSB_PROSNJE_ZA_BIVANJE pzb2 
WHERE PZB2.VRSTA_STUD_DOMOV_ID=pzb.VRSTA_STUD_DOMOV_ID
AND PZB2.MSB_STATUS=PZB.MSB_STATUS 
AND PZB2.OBD_ZA_POSILJANJE_PROSENJ_ID=pzb.OBD_ZA_POSILJANJE_PROSENJ_ID) stevilo 

整句话。所以现在我选择了所有内容和组,并且我还做了另一个选择,我认为所有受影响的组中的stevilo。它现在有效。

SELECT pzb.VRSTA_STUD_DOMOV_ID,
pzb.MSB_STATUS,
pzb.OBD_ZA_POSILJANJE_PROSENJ_ID,
OBD.OBDOBJE_PRIKAZ,
pzb.NAZIV_VRSTE_STUD_DOMOV,
PZB.OZNAKA_STATUSA_PROSNJE,
PZB.STUDIJSKO_LETO_ID,
PZB.STUDENTSKI_DOM_ID,
PZB.VISOKOSOLSKO_SREDISCE_ID,
PZB.NAZIV_VISOKOSOLSKEGA_SREDISCA NAZIV_V_SREDISCA,
PZB.NASLOV_VISOKOSOLSKEGA_SREDISCA NASLOV_V_SREDISCA,
PZB.NAZIV_STUD_DOM,
(SELECT COUNT(*) FROM MSB_PROSNJE_ZA_BIVANJE pzb2 
WHERE PZB2.VRSTA_STUD_DOMOV_ID=pzb.VRSTA_STUD_DOMOV_ID
AND PZB2.MSB_STATUS=PZB.MSB_STATUS 
AND PZB2.OBD_ZA_POSILJANJE_PROSENJ_ID=pzb.OBD_ZA_POSILJANJE_PROSENJ_ID) stevilo 

FROM MSB_PROSNJE_ZA_BIVANJE_VW pzb,
S_OBD_POS_PRS_ZA_SUBV_VW obd

WHERE PZB.OBD_ZA_POSILJANJE_PROSENJ_ID=OBD.OBD_ZA_POSILJANJE_PROSENJ_ID 
GROUP BY  pzb.VRSTA_STUD_DOMOV_ID,
pzb.MSB_STATUS,
pzb.OBD_ZA_POSILJANJE_PROSENJ_ID,
OBD.OBDOBJE_PRIKAZ,
pzb.NAZIV_VRSTE_STUD_DOMOV,
PZB.OZNAKA_STATUSA_PROSNJE,
PZB.STUDIJSKO_LETO_ID,
PZB.VISOKOSOLSKO_SREDISCE_ID,
PZB.NAZIV_VISOKOSOLSKEGA_SREDISCA,
PZB.NASLOV_VISOKOSOLSKEGA_SREDISCA,
PZB.NAZIV_STUD_DOM,
PZB.STUDENTSKI_DOM_ID
ORDER BY pzb.VRSTA_STUD_DOMOV_ID