Propojení tabulek + výpočty – MS SQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Propojení tabulek + výpočty – MS SQL – Fórum – Programujte.comPropojení tabulek + výpočty – MS SQL – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
MeFi100
~ Anonymní uživatel
9 příspěvků
19. 8. 2014   #1
-
0
-

Mám drobný problém. Spojil jsem tabulky joinem a potřebuji sečíst hodnoty z tabulek (zustatek1, zustatek2). Bohužel mi nejde sečíst. Myslím, že je to tím, že díky spojení tabulky se 100.000 záznamy a tabulky, kde je záznamů pár desítek byly doplněny chybějící záznamy hodnotou null. Zkoušel jsem UPDATE pohledu (sloupce zůstatek 2), tak, aby hodnotu null přepsal na 0. Bohužel mi to napsalo, že že nemůže být provedeno z důvodu porušení kontrolních pravidel. Nevíte, jak bych mohl tento problém obejít? Díky.

Nahlásit jako SPAM
IP: 193.85.188.–
Reklama
Reklama
Matěj Andrle+1
Grafoman
19. 8. 2014   #2
-
-1
-
Mimo téma
Kit -

#1 MeFi100
Nullable dej na false a defaultní hodnotu dej 0.

Nahlásit jako SPAM
IP: 78.136.164.–
Kit+11
Guru
19. 8. 2014   #3
-
0
-

#1 MeFi100
Sloupce s NULL se v agregační funkci SUM() ignorují. NULL tedy ničemu nevadí.

Pošli sem ten dotaz, zřejmě v něm budeš mít jinou chybu, než si myslíš.

Nahlásit jako SPAM
IP: 88.103.124.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Flowy0
Věrný člen
19. 8. 2014   #4
-
0
-

ako sa da v tabulke ktora je cisto len pre zobrazenie vystupu z joinu zmenit null na 0? ... preco by to vlastne niekto robil?

len taky detail ... pri pouziti subquery by nevznikali nezmyselne riadky ...

inak vecsina RDBMS pre MySQL ignoruje NULL v SUM ... ale myslim ze v standarde to nieje

Nahlásit jako SPAM
IP: 91.148.1.–
https://github.com/Flowy
MeFi100
~ Anonymní uživatel
9 příspěvků
20. 8. 2014   #5
-
0
-

Příkaz (nemám teď přístup, ale takhle přibližně to bylo):

SELECT Podúčty.ID, Podúčty.Měna, Podúčty.Zůstatek, Jistoty.JistotaCM, Opravy.OpravaČástkyCM, Kurzy.Kurz,
Součet = Podúčty.Zůstatek + Jistoty.JistotaCM + Opravy.OpravaČástkyCM,
CM = součet * Kurzy.Kurz
FROM Podúčty LEFT JOIN Jistoty ON Podúčty.ID = Jistoty.ID LEFT JOIN Opravy ON Podúčty.ID = Opravy.ID LEFT JOIN Kurzy ON Podúčty.Měna = Kurzy.Měna;

Jinak díky moc za rychlé odezvy. FM 

Nahlásit jako SPAM
IP: 193.85.188.–
Flowy0
Věrný člen
20. 8. 2014   #6
-
0
-

v SELECT len vymenovavas stlpce ktore chces vytlacit ... ak ho chces pomenovat tak su na to specialne sposoby

v SELECT urcite nedefinuj Soucet ani CM ... v podstate ho ani nepouzivas ... proste tam napis co chces vytlacit ... ked tam napises 100 tak ti do kazdeho riadku da 100 ... ak tam napises 100+1 tak ti tam da 101 atd ...

Nahlásit jako SPAM
IP: 91.148.1.–
https://github.com/Flowy
P
~ Anonymní uživatel
193 příspěvků
20. 8. 2014   #7
-
0
-

   

SELECT
      Podúčty.ID
    , Podúčty.Měna
    , Podúčty.Zůstatek
    , Jistoty.JistotaCM
    , Opravy.OpravaČástkyCM
    , Kurzy.Kurz
    , Součet = ISNULL(Podúčty.Zůstatek, 0) + ISNULL(Jistoty.JistotaCM, 0) + ISNULL(Opravy.OpravaČástkyCM, 0)
    , CM = (ISNULL(Podúčty.Zůstatek, 0) + ISNULL(Jistoty.JistotaCM, 0) + ISNULL(Opravy.OpravaČástkyCM, 0)) * ISNULL(Kurzy.Kurz, 0)
FROM
    Podúčty
    LEFT JOIN Jistoty ON Podúčty.ID = Jistoty.ID
    LEFT JOIN Opravy ON Podúčty.ID = Opravy.ID
    LEFT JOIN Kurzy ON Podúčty.Měna = Kurzy.Měna
;

V jednom selectu nelze pouzit ve vypoctu jiny sloupec vypocteny v tomtez selectu (v tomto pripade Soucet)

BTW pouzivani diakritiky v nazvech tabulek a sloupcu je prasarna a jen si tim zadelavas na problemy.

Nahlásit jako SPAM
IP: 85.93.116.–
MeFi100
~ Anonymní uživatel
9 příspěvků
25. 8. 2014   #8
-
0
-

Upravil jsem diakritiku, přesto se stále potýkám se dvěma problémy. První z nich je u LEFT JOIN. Pokud napíšu jeden, je to v pohodě. Pokud však dám:

SELECT
     T_Poducty.ID, T_Poducty.Mena, T_Poducty.Zustatek, T_Jistoty.Jistota, T_Opravy.Oprava, T_Meny.Kurz
FROM
    Poducty
    LEFT JOIN T_Jistoty ON T_poducty.ID = T_Jistoty.ID
    LEFT JOIN T_Opravy ON T_Poducty.ID = T_Opravy.ID
    LEFT JOIN T_Meny ON T_Poducty.Mena = T_Meny.Mena;

Access mi napíše: Syntaktická chyba (chybí operátor) v dotazovém výrazu T_Poducty.ID = T_Jistoty.ID LEFT JOIN ....

druhou věc, kterou se mi nepodařilo vyřešit je součet polí:

Tento příkaz mi píše nesprávný počet argumentů ve výrazu (ISNULL...

SELECT T_Poducty.ID, T_Poducty.Mena, T_Poducty.Zustatek,T_Jistoty.Jistota, (ISNULL([T_Poducty.Zustatek], 0))+(ISNULL([T_Jistoty.Jistota], 0)) AS SUMA
FROM
T_Poducty
LEFT JOIN T_Jistoty ON T_Poducty.ID = T_Jistoty.ID;

A standardní 

SELECT T_Poducty.ID, T_Poducty.Mena, T_Poducty.Zustatek,T_Jistoty.Jistota, [T_Poducty.Zustatek]+[T_Jistoty.Jistota] AS SUMA
FROM
T_Poducty
LEFT JOIN T_Jistoty ON T_Poducty.ID = T_Jistoty.ID;

mi sečte pouze buňky, ve kterých je hodnota ve sloupci Jistina. Tam, kde je pouze Zůstatek, tam součet neproběhne. Díky za pomoc.

Nahlásit jako SPAM
IP: 193.85.188.–
P
~ Anonymní uživatel
193 příspěvků
25. 8. 2014   #9
-
0
-

ad 1) mas tam "FROM Poducty" a pak "ON T_Poducty.ID" atd.

ad 2) Access ma svou funkci ISNULL, ktera je jina. Zkus tedy COALESCE(T_Poducty.Zustatek, 0) .

Access moc neznam, vychazel jsem z toho, ze se jedna o MSSQL, kdyz je to v teto sekci.

Nahlásit jako SPAM
IP: 85.93.116.–
P
~ Anonymní uživatel
193 příspěvků
25. 8. 2014   #10
-
0
-

Tak Access COALESCE nezna, ale lze to resit vice zpusoby.

Viz Google access coalesce

Nahlásit jako SPAM
IP: 85.93.116.–
MeFi100
~ Anonymní uživatel
9 příspěvků
26. 8. 2014   #11
-
0
-

Dík za tip! Nz funguje bez potíží včetně sumy. Tak už mě trápí jenom to spojení. Samostatně jsem schopen poskládat v rámci postupných dotazů. Pokud však chci vše v jednom a vyberu vše, co potřebuju, pod sebe dám 3 x LEFT JOIN, napíše mi syntaktickou chybu. Přitom jsem to kontroloval a mám snad vše v pohodě:

SELECT
     T_Poducty.ID, T_Poducty.Mena, T_Poducty.Zustatek, T_Jistoty.Jistota, T_Opravy.Oprava, T_Meny.Kurz
FROM
    Poducty
    LEFT JOIN T_Jistoty ON T_poducty.ID = T_Jistoty.ID
    LEFT JOIN T_Opravy ON T_Poducty.ID = T_Opravy.ID
    LEFT JOIN T_Meny ON T_Poducty.Mena = T_Meny.Mena;

Hlásí to chybu syntaxe (chybí operátor) na konci řádku  

Poducty
LEFT JOIN T_Jistoty ON T_poducty.ID = T_Jistoty.ID

Nahlásit jako SPAM
IP: 193.85.188.–
P
~ Anonymní uživatel
193 příspěvků
26. 8. 2014   #12
-
0
-

Tak jeste jednou:

zakladni tabulka v selectu je Poducty

v JOINu mas ON T_Poducty.ID =

Cili to budes pojmenovavat vsude bud Poducty, nebo T_Poducty, ale ne pokazde jinak.

Kapisto?

Nahlásit jako SPAM
IP: 85.93.116.–
MeFi100
~ Anonymní uživatel
9 příspěvků
26. 8. 2014   #13
-
0
-

Díky moc za rady. Jsem poněkud pomalejší. Funguje mi takto:

SELECT
     T_Poducty.ID, T_Poducty.Mena, T_Poducty.Zustatek, T_Jistoty.Jistota, T_Opravy.Oprava, T_Meny.Kurz
FROM
    ((T_Poducty
    LEFT JOIN T_Jistoty ON T_Poducty.ID = T_Jistoty.ID)
    LEFT JOIN T_Opravy ON T_Poducty.ID = T_Opravy.ID)
    LEFT JOIN T_Meny ON T_Poducty.Mena = T_Meny.Mena;

Nahlásit jako SPAM
IP: 193.85.188.–
MeFi100
~ Anonymní uživatel
9 příspěvků
26. 8. 2014   #14
-
0
-

A komplet dohromady, jak jsem potřeboval je:

SELECT T_Poducty.ID, T_Poducty.Mena, T_Poducty.Zustatek, Nz(T_Jistoty.Jistota, 0) AS Jistota, Nz(T_Opravy.Oprava, 0) AS Oprava, [T_Poducty.Zustatek]+[Jistota]+[Oprava] AS Suma, T_Meny.Kurz, [Suma]*[T_Meny.Kurz] AS Celkem
FROM 
((T_Poducty LEFT JOIN T_Jistoty ON T_Poducty.ID = T_Jistoty.ID) 
LEFT JOIN T_Opravy ON T_Poducty.ID = T_Opravy.ID) 
LEFT JOIN T_Meny ON T_Poducty.Mena = T_Meny.Mena;

Ještě jednou všem moc díky.

Nahlásit jako SPAM
IP: 193.85.188.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

Propojení dvou tabulek — založil Pavelv

Propojení dvou tabulek MySQL. — založil hustoles

Datum a čas - výpočty — založil Ladis

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý