2015-11-05 55 views
-2

我需要莫名其妙的做SUM(mnozstvi)SUM(prostoje)用于具有相同dtzdanitpln +相同podminky +相同jmeno_uziv的细胞。还后,我集团是由这3个条件,同时具有SUM(mnozstvi)我需要有AVG功能为他们mnpracovniku,naklad列和hdudrzbapracovisteSUM和多列SAME值的细胞的AVG

我搜索的解决方案做相同的id细胞的SUM在另一个细胞,但我得到的错误,当我尝试改变我的group by,例如,如果我尝试删除从集团PRAC,我得到这个:

消息8120,级别16,状态1,行20列“temptab.pracoviste”在选择列表中是 无效,因为它不包含在 聚合函数或GROUP BY子句中。

消息8120,级别16,状态 1,因为它不是在聚合函数或 GROUP BY子句行包含列20“temptab.pracoviste”是在选择列表 无效。

消息8120,级别16,状态1,行20列 'temptab.pracoviste'在选择列表中无效,因为它不是包含在集合函数或GROUP BY子句中的 。

消息 8120,级别16,状态1,行20列“temptab.pracoviste”是 在选择列表中无效,因为它不是在任何一个 聚合函数或GROUP BY子句中包含。

select 
    count (temptab.idhdok) as pocet, 
    temptab.ucet_obd, 
    temptab.dtzdanitpln, 
    substring (temptab.podminky_text, 4,2) as podminky, 
    temptab.jmeno_uziv, 
    temptab.textpozn2, 
    count(temptab.pracoviste) as prac, 
    temptab.mnpracovniku, 
    SUM(temptab.hdmzda_naklad_smena) as naklad, 
    temptab.hdodpis_naklad_smena, 
    (select count(*) from qsdok where (cis_zbozi = 'PROSTOJ 03.3' or cis_zbozi = 'PROSTOJ 07' or cis_zbozi = 'PROSTOJ 08' or cis_zbozi = 'PROSTOJ 10') and qsdok.idhdok=temptab.idhdok) as prostoje, 
    (select sum(qhdok_udr.hdccenaval2) 
    from qhdok_udr 
     left join typdok on typdok.idtypdok = qhdok_udr.idtypdok 
    where 
     typdok.typ_dok = 'UDR' and 
     qhdok_udr.podminky_text != 'UDRMECH' and 
     qhdok_udr.ucet_obd like '%2015.09%' and 
     qhdok_udr.cis_zbozi_pracovisteadd like temptab.pracoviste 
) as hdudrzbapracoviste, 
    (select sum(qhdok_udr.hdccenaval2) 
    from qhdok_udr 
     left join typdok on typdok.idtypdok = qhdok_udr.idtypdok 
    where 
     typdok.typ_dok = 'UDR' and 
     qhdok_udr.podminky_text != 'UDRMECH' and 
     qhdok_udr.ucet_obd like '%2015.09%' and 
     (qhdok_udr.cis_zbozi_pracovisteadd like 'M%') 
) as hdudrzbacelkem, 
    (select sum(qhdok_udr.hdccenaval2) 
    from qhdok_udr 
     left join typdok on typdok.idtypdok = qhdok_udr.idtypdok 
    where 
     typdok.typ_dok = 'UDR' and 
     qhdok_udr.podminky_text = 'UDRMECH' and 
     qhdok_udr.ucet_obd like '%2015.09%' and 
     qhdok_udr.cis_zbozi_pracovisteadd like temptab.pracoviste  
) as hdmechanikpracoviste, 
    (select sum(qhdok_udr.hdccenaval2) 
    from qhdok_udr 
     left join typdok on typdok.idtypdok = qhdok_udr.idtypdok 
    where 
     typdok.typ_dok = 'UDR' and 
     qhdok_udr.podminky_text = 'UDRMECH' and 
     qhdok_udr.ucet_obd like '%2015.09%' 
) as hdmechanikcelkem, 
    sum(temptab.mnZmetky) as mnZmetky, 
    sum(temptab.mnTuk) as mnTuk, 
    sum(temptab.mnKukurice) as mnKukurice, 
    sum(temptab.mnFolie) as mnFolie, 
    sum(temptab.mnozstvi) as mnozstvi, 
    sum(temptab.mnZmetky) * 24.7 as hdZmetky, 
    sum(temptab.mnTuk) * 30 as hdTuk, 
    sum(temptab.mnKukurice) * 10 as hdKukurice, 
    sum(temptab.mnFolie) * 130 as hdFolie, 
    sum((temptab.mnZmetky * 24.7)+(temptab.mnTuk * 30)+(temptab.mnKukurice * 10)+(temptab.mnFolie * 130)) as hdCelkem, 
    sum((temptab.mnZmetky * 24.7)+(temptab.mnTuk * 30)+(temptab.mnKukurice * 10)+(temptab.mnFolie * 130))/isnull(nullif(sum(temptab.mnozstvi),0),1) as hdKs 
from 
(select 
    qhdok.idhdok, 
    qhdok.ucet_obd, 
    qhdok.dtzdanitpln, 
    qhdok.podminky_text, 
    qhdok.hdmzda_naklad_smena, 
    qhdok.hdodpis_naklad_smena, 
    pracoviste = case 
    when qhdok.podminky_text like 'KB%' then 'MKB' 
    when qhdok.podminky_text like '2UP%' then 'MUP' 
    when qhdok.podminky_text like 'M3%' then 'M3' 
    when qhdok.podminky_text like 'PUK%' then 'PUK' 
    when qhdok.podminky_text like 'M1%' then 'M1' 
    when qhdok.podminky_text like 'M2%' then 'M2' 
    else '' 
    end, 
    qhdok.jmeno_uziv, 
    qhdok.mnpracovniku, 
    isnull((select sum(HDHDOKPOZNCISLO) from qhdokpozn where qhdokpozn.idhdok = qhdok.idhdok and qhdokpozn.KODTHDOKPOZN like 'VYRZMP'),0) as mnZmetky, 
    isnull((select sum(HDHDOKPOZNCISLO) from qhdokpozn where qhdokpozn.idhdok = qhdok.idhdok and qhdokpozn.KODTHDOKPOZN like 'VYRZMT'),0) as mnTuk, 
    isnull((select sum(HDHDOKPOZNCISLO) from qhdokpozn where qhdokpozn.idhdok = qhdok.idhdok and qhdokpozn.KODTHDOKPOZN like 'VYRZMK'),0) as mnKukurice, 
    isnull((select sum(HDHDOKPOZNCISLO) from qhdokpozn where qhdokpozn.idhdok = qhdok.idhdok and qhdokpozn.KODTHDOKPOZN like 'VYRZMF'),0) as mnFolie, 
    isnull((select top 1 cast(HDOKPOZNMEMO as varchar(max)) from qhdokpozn where qhdokpozn.idhdok = qhdok.idhdok and qhdokpozn.KODTHDOKPOZN like 'VYRPOZ'),'') as textpozn2, 
    isnull((select sum(dbo.fn_UO_mnPocetvAltMJ(qsdok.idzbozi, null, null, 'KS', qsdok.mncelkempocet)) from qsdok where qsdok.idhdok = qhdok.idhdok and qsdok.kod_pohyb ='P30' and qsdok.mncelkempocet>0 and 
        (qsdok.slozka_ident not like 'pmic%') and charindex('MIX',qsdok.nazev_zbozi)=0 and qsdok.cis_zbozi not like 'PROSTOJ%' and qsdok.cis_zbozi != 'POPCORN'),0) as mnozstvi 
from qhdok_smena qhdok 
where qhdok.typ_dok = 'SPU' and (qhdok.idhdok_vzor = 41875 or qhdok.idhdok_vzor = 239530) and qhdok.ucet_obd like '%2015.09%' and qhdok.podminky_text like '%%%'+'%' and (qhdok.podminky_text like 'M3%' or qhdok.podminky_text like '2UP%' or qhdok.podminky_text like 'KB%' or qhdok.podminky_text like 'M1%' or qhdok.podminky_text like 'M2%') 

-- qhdok.idhdok,qhdok.ucet_obd, qhdok.idhdok, qhdok.dtzdanitpln,qhdok.podminky_text, qhdok.hdmzda_naklad_smena, qhdok.hdodpis_naklad_smena, qhdok.jmeno_uziv, qhdok.textpozn2, qhdok.mnpracovniku 
) temptab 
group by temptab.idhdok, temptab.ucet_obd, temptab.dtzdanitpln, temptab.pracoviste, substring (temptab.podminky_text, 4,2), temptab.jmeno_uziv, temptab.textpozn2, temptab.mnpracovniku, temptab.hdodpis_naklad_smena, temptab.hdmzda_naklad_smena 

这个例子我有什么什么,我需要: EXAMPLE

回答

0

要放什么东西在你的GROUP BY子句应该很容易说:“我希望每一个结果记录__________________” 。比方说,你填补了这一空白与temptab.idhdok, temptab.ucet_obd, temptab.dtzdanitpln,那么你的GROUP BY子句是相应:

GROUP BY temptab.idhdok, temptab.ucet_obd, temptab.dtzdanitpln; 

您在SELECT子句中使用的其他所有列必须用SUM,AVG,MIN,MAX等你获取聚合已通过SUM(temptab.hdmzda_naklad_smena)完成。

因此,当您从您现有的GROUP BY子句中删除temptab.pracoviste时,不能再使用此列本身,而只能使用它的一个集合,例如MIN(temptab.pracoviste)

因此,例如行

qhdok_udr.cis_zbozi_pracovisteadd like temptab.pracoviste 

将不得不

qhdok_udr.cis_zbozi_pracovisteadd like MIN(temptab.pracoviste) 

然后。

顺便说一句:这是为什么like?这是没有意义的,因为pracoviste不包含通配符。它应该简单地是=而不是like

一件事:

count (temptab.idhdok) as pocet 
count(temptab.pracoviste) as prac 

pracoviste是从来没有空,所以它是一样的count(*)idhdok是否可以为NULL?否则,它也会等于count(*)。这是需要的吗?

+0

谢谢,我得到了sum,avg,min等聚合的东西。我根据这个改变了我的组,但是我仍然有我的结果留下应该合并的两行分开(在我的例子中它应该是这些,有jmeno_uziv =“C”和“dtzdanitpln = 2015-09-11 00:00:00”,我认为这是因为我有temptab.idhdok在集团仍然..因为每个idhdok是独一无二的,所以它不会将它们合并在一起..现在我的分组看起来像这样:group by temptab.idhdok,temptab.ucet_obd,temptab.dtzdanitpln –

+0

你是对的,因为你不想为不同的'idhdok ',它不是列在“我希望每个__________________有一个结果记录”的间隙中的列,因此不能成为GROUP BY子句的一部分。 –

+0

很好,现在它工作:)谢谢,仍然可能会来如果我能找到一些东西,明天回来需要修复。 –