Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: frufru 28. 03. 2018, 11:01:20
-
Zdravim,
mam nasledujucu tabulku:
nazov firmy | cislo faktury | variabilny symbol |
prva | 1 | 10 |
prva | 2 | 20 |
prva | 3 | 20 |
druha | 4 | 40 |
druha | 5 | 50 |
druha | 6 | 40 |
prva | 7 | 70 |
prva | 8 | 70 |
prva | 9 | 90 |
Zistit duplicity v jednom stlpci - napr. vo variabilnom symbole viem, ale potreboval by som zlozitejsi dotaz, ktoreho vysledkom by bolo:
nazov firmy | cislo faktury | variabilny symbol |
prva | 2 | 20 |
prva | 3 | 20 |
druha | 4 | 40 |
druha | 6 | 40 |
prva | 7 | 70 |
prva | 8 | 70 |
je nieco take vobec v sql mozne? ak ano mozte ma nakopnut spravnym smerom pls? za akukolvek pomoc vopred velka vdaka.
-
Group by podle sloupecku, co te zajimaji. A pokud ma skupina vic nez jeden clen...
-
Podle mne je mnohem jednodušší zabránit duplicitě už při vzniku slovem UNIQUE v definici sloupce tabulky.
-
Podle mne je mnohem jednodušší zabránit duplicitě už při vzniku slovem UNIQUE v definici sloupce tabulky.
To ale asi neni soucasti tohohle cviceni z Databaze 101, protoze DDL se bere az pozdeji ;)
-
select t1.*
from faktura t1
join faktura t2 on t1.variabilnySymbol=t2.variabilnySymbol and t1,cisloFaktury!=t2.cisloFaktury
-
Udělal bych to na 2x:
1) zjistit, které záznamy jsou duplicitní na dvojici "nazov firmy", "variabilny symbol"
2) na tyto záznamy provést join původní tabulky
SELECT
T1.*
FROM TABULKA T1
JOIN
(SELECT
nazov firmy,
variabilny symbol
GROUP BY nazov firmy,
variabilny symbol
HAVING COUNT(*) > 1) T2
ON (T1.nazov firmy = T2.nazov firmy)
AND (T1.variabilny symbol = T2.variabilny symbol)
-
Podle mne je mnohem jednodušší zabránit duplicitě už při vzniku slovem UNIQUE v definici sloupce tabulky.
v tomto pripade dupliticu nie je mozne riesit priamo v db lebo rozne firmy mozu pouzivat rovnake cislovanie svojich faktur(cize mozu existovat rovnake VS). rovnake VS by ale nemali vzniknut pri jednej firme(a ani tam to celkom neplati, lebo napr. taky orange pouzivat ako VS cislo zmulvy alebo cislo zakaznika, takze viacere faktury mozu mat rovnake VS).
-
select t1.*
from faktura t1
join faktura t2 on t1.variabilnySymbol=t2.variabilnySymbol and t1,cisloFaktury!=t2.cisloFaktury
dik, toto vyzera pouzitelne. uz mi niekto radil, ze mam na to pouzit selfjoin, len som nevedl ako presne to spravit...
-
Samozrejme, ze jde vytvorit unikatni constrain pro vice sloupcu. Ve vasem pripade neco jako UNIQUE KEY (nazev_firmy, variabilni_symbol).
-
Podle mne je mnohem jednodušší zabránit duplicitě už při vzniku slovem UNIQUE v definici sloupce tabulky.
v tomto pripade dupliticu nie je mozne riesit priamo v db lebo rozne firmy mozu pouzivat rovnake cislovanie svojich faktur(cize mozu existovat rovnake VS). rovnake VS by ale nemali vzniknut pri jednej firme(a ani tam to celkom neplati, lebo napr. taky orange pouzivat ako VS cislo zmulvy alebo cislo zakaznika, takze viacere faktury mozu mat rovnake VS).
UNIQUE může hlídat duplicitu n-tice sloupců. Každý záznam v DB by měl být unikátní.
Proč nemá každá firma svou databázi?
-
Ahoj, trochu si dovolim dotaz rozsirit. Jak by se resila situace, kdy chci ziskat pocet neduplicitnich a 'not null' hodnot v radku?
smena | pracovnik1 | pracovnik2 | pracovnik3 |
1 | Franta | Pepa | Jirka |
2 | Alois | Franta | null |
3 | Alois | Alois | null |
Vysledek:
smena | pracovnik1 | pracovnik2 | pracovnik3 | pritomno_na_smene |
1 | Franta | Pepa | Jirka | 3 |
2 | Alois | Franta | null | 2 |
3 | Alois | Alois | null | 1 |
-
COUNT(DISTINCT .... ) WHERE ...
-
Jo, v řádku, tak to musíš posčítat. Řádkové operace SQL nepodporuje. Čili něco jako
3 - CAST(IS_NULL(sloupec_1)) - - CAST(IS_NULL(sloupec_2)) - CAST(IS_NULL(sloupec_3))
Ale pokud něco takovýho potřebuješ Ty, tak si blbě navrhnul strutkturu db. A pokud to potřebuje
cvičící, tak blbě navrhnul cvičení :-)