NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Výpočet v jedné tabulce s vícero řádek

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Václav Černý:3.2.2017 23:49

Ahoj,

snažím se v našem informačním systému docílit toho, abych měl přehled výnosů za dané období po úhradě faktury.

V jedné tabulce TabPohybyZbozi se ukládají informace o jednotlivých pohybech na výdejkách kde je uvedena nákupní cena, které se následně přetahují na fakturu. Ale bohužel u řádky pohybu faktury chybí už informace o nákupní ceně. Ale propojení je realizováno pomocí sloupečku s ID původního dokladu, kde je na pohybu nákupní cena uvedená.

V druhé tabulce TabDokladyZbozi jsou ukládány informace o samotném dokladu. Z této tabulky nás zajímá jen ID dokladu a datum úhrady faktury.

Níže uvedený kód by měl k danému datumu z faktur sečíst prodejní cenu a odečíst o ní nákupní cenu z pohybu výdejky. Nicméně mi dotaz vrací chybu, že poddotaz vrací více jak jednu hodnotu.

Napadá Vás něco?

select sum(CenaProdejni) - (select sum(CenaNakupni) from TabPohybyZbozi as p where p.IDDoklad = pohyby.IDOldDoklad)
from TabPohybyZbozi as pohyby
inner join TabDokladyZbozi as doklady on pohyby.IDDoklad = doklady.ID
where
doklady.DatumUhrady = convert(datetime,'1.1.2017) and doklady.DruhPohybu = faktura
group by doklady.DatumUhrady, pohyby.IDOldDoklad

Výtah sloupečků z tabulky:

TabPohybyZobzi

ID IDDoklad IDOldDoklad IDZbozi CenaProdejni CenaNakupni
1 222   101 1000 800
2 222   102 2000 1800
3 223   103 3000 800
4 224 222 101 1000  
5 224 222 102 2000  
6 224 223 103 3000  

TabDokladyZbozi

ID DruhPohybu DatumUhrady
222 vydejka  
223 vydejka  
224 faktura 1.1.2017
 
Odpovědět
3.2.2017 23:49
Avatar
Odpovídá na Václav Černý
Michal Štěpánek:4.2.2017 10:10

Když očekáváš jednu hodnotu jako výsledek, k čemu tam je to "group by"?

Nahoru Odpovědět
4.2.2017 10:10
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Václav Černý:4.2.2017 22:16

Jen zkouška různých řešení, o které jsem se pokoušel.

 
Nahoru Odpovědět
4.2.2017 22:16
Avatar
Odpovídá na Václav Černý
Michal Štěpánek:4.2.2017 22:29

Používej tlačítko odpovědět. Myslím, že tu chybu způsobuje právě to "group by"...

Nahoru Odpovědět
4.2.2017 22:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Václav Černý:5.2.2017 0:56

Bohužel to tak není. Když jsem s tím experimentoval tak jsem přišel na to, že první SUM(CenaProdejni) je v pořádku a vrací pouze jednu položku. Ale druhý sub select vrací více položek. A to bude ten problém.

 
Nahoru Odpovědět
5.2.2017 0:56
Avatar
Odpovídá na Václav Černý
Michal Štěpánek:5.2.2017 9:10

Zkus si ten select nejdřív rozdělit. Zjistil bych ID faktury, která vyhovuje podmínce (tady 224), v dalším kroku bych zjistil čísla dokladů, kterých se tato faktura týká (tady 222 a 223) a pak bych dělal součty a rozdíly cen těch dokladů...
Když ti toto bude fungovat, pak ba ses mohl pokusit ty dotazy nějak vcucnout do jednoho

Nahoru Odpovědět
5.2.2017 9:10
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Václav Černý
Michal Štěpánek:5.2.2017 9:19

Ve finále by ten dotaz mohl vypadat třeba nějak takto

SELECT SUM(CenaProdejni - CenaNakupni) FROM TabPohybyZbozi
 WHERE IDDoklad IN(SELECT IDOldDoklad FROM TabPohybyZbozi
WHERE IDDoklad IN (SELECT ID FROM TabDokladyZbozi
WHERE DatumUhrady = convert(datetime,'1.1.2017)))

Píšu to z hlavy, nezkoušel jsem to...

Editováno 5.2.2017 9:20
Nahoru Odpovědět
5.2.2017 9:19
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Václav Černý:5.2.2017 22:33

Díky za pomoc, nakonec jsem to vyřešil následovně:

SELECT cena_prodejni - cena_nakupni
FROM
(SELECT SUM(CenaProdejni) AS cena_prodejni, (SELECT SUM(CenaNakupni) from TabPohybyZbozi AS p WHERE p.IDDoklad = pohyby.IDOldDoklad AND p.IDZbozi = Pohyby.IDZbozi)
WHERE
doklady.DatumUhrady =  convert(datetime,'1.1.2017') AND doklady.DruhPohybu = faktura
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
5.2.2017 22:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.