MS SQL - riadky s medzisuctom a celkovym suctom preskocit v cislovani
V selecte mam vybrane stlpce, spravene medzisucty a sucty pomocou grouping set. Vsetko ok, ale . . . ale potrebujem ocislovat riadky, to by nebol problem, ale zase ale . . . ale maju sa ocislovat len riadky z tabulky, nie riadky v ktorych je medzisucet. ked pouzijem row_number, ocisluje mi vsetky. Ta sa vobec dosiahnut to, aby riadky s medzisuctom a celkovym suctom preskocil v cislovani? A musi to byt v jenom selecte, nemoze to byt napr nejaka funkcia ci trigger ci co, nemam to ako ulozit.
Změna hloupého předmětu, původně: MSSQL (host)
nazov dotazu ako blbec, pozdrav ziaden, poprosenie ziadne, podakovanie ziadne. co cakas?
Bojím se, že tohle nebude v rámci jednoho dotazu řešitelné.
Tohle se normálně řeší, podobně jako formátování v prezentační vrstvě (klientovi), ne v datové vrstvě.
Můžeš to vyřešit oklikou - výběrem dat s očíslovanými řádky + UNION s mezisoučty + UNION s výsledným součtem.
Unionu som sa chcel prave vyhnut, ja som nic schodne neobjavil. Ale zas niesom v tomto expert, tak som myslel ci neexistuje nejaka fina . . .
Tam v podstate ziadna coby prezentacna vrstva nieje, vysledok sa exportuje do txt.
Dik, mozno bude schodnejsia cesta zmenit spracovanie toho txt (ale o tom neviem nic, co sa deje dalej . . . .)
Dalo by se to řešit i přes parametrické VIEW, tam už by sis mohl udělat, co potřebuješ.
I funkce by se dala napsat - vysledkem funkce by byl select * from funkce
I uložená procedura by se dala napsat - misto selectu by bylo spuštění procedury
Ani jedna z možností by neovlivnila následné zpracování, chovalo by se to stejně jako tvůj select
Vdaka, to uz je asi mimo mna, funkcia a ulozena procedura by nebolo kam ulozit, mam k dispozicii iba editovatelny riadok do ktoreho sa musim vtesnat, co je v nom to sa vykona . . . vdaka.
Když jsem si to zkoušel, tak se to podle mne chová dle potřeby
Mezisoučty mají ID = null, takže prázné.
Pokud tam chceš ít nulu, tak to stačí ošetřit, případně i u názvů:
Velke dik, idem sa do toho zhlbit a vyskusat, ci sa mi to podari len ten select
Pozeram na to, problem je, ze nemam stlpec ID (identity), mozem pracovat len s tym co mam, nemozem pridat stpec do tbl ani zadefinovat kluc . . . Max mozem vyuzit nejake rucne ocislovanie, alebo automaticke row_number alebo nieco podobne . . . .
Zkusime to obejit. Treba to tve prostredi vezme 2 SQL prikazy za sebou. Zkus to tam vlozit a spustit.
Prvni vytvori pomocnou tabulku, do ktere prida ID a druhy uz jsou group sets z pomocne tabulky
Problem by mohl byt pri vicenasobnem spusteni, pokud zustane zachvana connection - existence pomocne tabulky.
Pak by za strednikem mohl nasledovat jeste prikaz:
Ale tohle uz nemusi projit, protoze ten tvuj "radek" bude mit pouze pravo na spusteni SQL a uz ne na vytvareni a dropovani temp tabulek.
Ještě mě napadl další Workarround. V teto tabulce nemam ID, ale pouzil jsem subselect, ve kterem pomoci Row_Number() ocisluju radky a na ten subselect teprve pouziju groupovani. Tohle je fyzicky jen jeden select a mel by jit spustit i v tom tvem prostredi.
Tak dostal som sa k tomu, konecne, velke diky za snahu, ale nieje to dobre. Priklad ide ok, ale ako nahle vlozim napr insert into @tTemp (Nazev, Skupina, Pocet) values
('Jedna', 1, 10),
('Dva', 4, 15),
('Tri', 4, 5),
('Ctyri', 2, 12) tak sa to cele rozsype, pretoze v priklade ti ide zaradom skupina 1,2 . . . riadky sa mi ocisluju, ale potom vysledok mam napr id null, null, 1,2,5, null, 3,4,7, nul..... namiesto napr. 1,2,3 null, 4 5 6....
cislovat id musi az vysledok
myslim ze toto uz prekroci susedsku mieru vypomoci, aj tak dik.
aj ked nie vybavene, tak dame vybavene, musim to obabrat inac . . .
DIK
Skús:
declare @tTemp table (Skupina int, Nazev char(10), Pocet int)
insert into @tTemp (Nazev, Skupina, Pocet) values
('Jedna', 1, 10),
('Dva', 4, 15),
('Tri', 4, 5),
('Ctyri', 2, 12)
SELECT ID, Skupina, Pocet = Sum(Pocet)
FROM (select ID = ROW_NUMBER() OVER (ORDER BY Skupina, Pocet), * from @tTemp) a
GROUP BY
GROUPING SETS (
(Skupina, ID),
(Skupina),
() )
ORDER BY
Skupina, 1;
neskutocne diky, test funguje, idem to skusit aplikovat na moje data . . . DIK
(ale sucty byvaju na konci )
So suctami na konci:
declare @tTemp table (Skupina int, Nazev char(10), Pocet int)
insert into @tTemp (Nazev, Skupina, Pocet) values
('Jedna', 1, 10),
('Dva', 4, 15),
('Tri', 4, 5),
('Ctyri', 2, 12)
SELECT ID, Skupina, Pocet = Sum(Pocet)
FROM (select ID = ROW_NUMBER() OVER (ORDER BY Skupina, Pocet), * from @tTemp) a
GROUP BY
GROUPING SETS (
(Skupina, ID),
(Skupina),
() )
ORDER BY
Skupina,
CASE
WHEN ID IS NULL THEN 1
ELSE 0
END, ID
;
To som nemyslel ze to prerobis, stacilo na konci vyhodit order by . . . .
uz som to "narouboval" na moje stlpce, to by som neveril ze je take nieco mozne . . .
Chlapi, mate moj obdiv
D I K