在SQL Server中使用Group By查询获取正确的结果

时间:2013-09-09 17:44:05

标签: sql sql-server

我有以下查询

with CTE as 
(
  select Barkod, sum(kolicina) as Kolicina 
  from stocks
  where Barkod = '555'
  group by Barkod
)
select s.Barkod, s.Kategorija, s.Artikal, s.Opis, s.Kolicina, s.N_cena,
  s.N_Iznos, s.P_cena, s.P_Iznos, s.datum, s.Golemina from Stocks as s
join CTE as b 
  on b.Barkod = s.Barkod

此查询的结果是

555 КОШУЛА      QWRSF    QWRSF    10    10.00   NULL   20.00   NULL    NULL  NULL
555 КОШУЛА      QWRSF    QWRSF     1    10.00   NULL   20.00   NULL    NULL  NULL

我需要得到以下结果

555 КОШУЛА      QWRSF    QWRSF    11    10.00   NULL   20.00   NULL    NULL  NULL

所以我需要总结一下Kolicina领域并将其全部排成一行。

3 个答案:

答案 0 :(得分:1)

你非常亲密......只是最后一个分组。

select s.Barkod, s.Kategorija, s.Artikal, s.Opis, sum(s.Kolicina), s.N_cena,
s.N_Iznos, s.P_cena, s.P_Iznos, s.datum, s.Golemina from Stocks as s
group by s.Barkod, s.Kategorija, s.Artikal, s.Opis,  s.N_cena,
s.N_Iznos, s.P_cena, s.P_Iznos, s.datum, s.Golemina

您可能需要求和的任何其他行都可以移出组,并在选择行中将sum()放在其中。

答案 1 :(得分:0)

您需要找到一些方法来聚合其他列。

e.g。

select
    Barkod, 
    sum(kolicina) as Kolicina, 
    Max(Kategorija) as Kategorija,
    Max(Artikal) as Artikal, 
    Max(Opis) as Opis, 
    Max(N_cena) as N_cena,
    Max(N_Iznos) as N_Iznos, 
    Max(P_cena) as P_cena, 
    Max(P_Iznos) as P_Iznos, 
    Max(datum) as datum, 
    Max(Golemina) as Golemina
from 
    stocks
where 
    Barkod = '555'
group by 
    Barkod

但是,这种模式往往会暗示您的数据未正确规范化。

或者,如果非求和列总是具有相同的Barkod值,您可以这样做:

select
    Barkod, 
    sum(kolicina) as Kolicina, 
    Kategorija,
    Artikal,
    Opis,
    N_cena,
    N_Iznos,
    P_cena,
    P_Iznos,
    datum,
    Golemina
from 
    stocks
where 
    Barkod = '555'
group by 
    Barkod,
    Kategorija,
    Artikal,
    Opis,
    N_cena,
    N_Iznos,
    P_cena,
    P_Iznos,
    datum,
    Golemina

答案 2 :(得分:0)

您需要更改..., s.Kolicina, ...的{​​{1}}才能从..., b.Kolicina, ...获取SUM。您的方式就是从table b选择所有Kolicina