Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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)

Předmět Autor Datum
nazov dotazu ako blbec, pozdrav ziaden, poprosenie ziadne, podakovanie ziadne. co cakas?
fallon (nereg.) 22.02.2022 13:57
fallon (nereg.)
Bojím se, že tohle nebude v rámci jednoho dotazu řešitelné. Tohle se normálně řeší, podobně jako for…
Jan Fiala 22.02.2022 14:09
Jan Fiala
Unionu som sa chcel prave vyhnut, ja som nic schodne neobjavil. Ale zas niesom v tomto expert, tak s…
truhlik 22.02.2022 14:46
truhlik
Dalo by se to řešit i přes parametrické VIEW, tam už by sis mohl udělat, co potřebuješ. I funkce by…
Jan Fiala 22.02.2022 14:55
Jan Fiala
Vdaka, to uz je asi mimo mna, funkcia a ulozena procedura by nebolo kam ulozit, mam k dispozicii iba…
truhlik 23.02.2022 09:15
truhlik
Když jsem si to zkoušel, tak se to podle mne chová dle potřeby Mezisoučty mají ID = null, takže práz…
Jan Fiala 23.02.2022 10:18
Jan Fiala
Velke dik, idem sa do toho zhlbit a vyskusat, ci sa mi to podari len ten select
truhlik 23.02.2022 11:57
truhlik
Pozeram na to, problem je, ze nemam stlpec ID (identity), mozem pracovat len s tym co mam, nemozem p…
truhlik 23.02.2022 13:19
truhlik
Zkusime to obejit. Treba to tve prostredi vezme 2 SQL prikazy za sebou. Zkus to tam vlozit a spustit…
Jan Fiala 23.02.2022 13:46
Jan Fiala
Ještě mě napadl další Workarround. V teto tabulce nemam ID, ale pouzil jsem subselect, ve kterem pom…
Jan Fiala 23.02.2022 13:59
Jan Fiala
Tak dostal som sa k tomu, konecne, velke diky za snahu, ale nieje to dobre. Priklad ide ok, ale ako…
truhlik 03.03.2022 19:53
truhlik
Skús: declare @tTemp table (Skupina int, Nazev char(10), Pocet int) insert into @tTemp (Nazev, Skup…
zavo 05.03.2022 09:56
zavo
neskutocne diky, test funguje, idem to skusit aplikovat na moje data . . . DIK (ale sucty byvaju na…
truhlik 05.03.2022 17:02
truhlik
So suctami na konci: declare @tTemp table (Skupina int, Nazev char(10), Pocet int) insert into @tTe…
zavo 05.03.2022 18:15
zavo
To som nemyslel ze to prerobis, stacilo na konci vyhodit order by . . . . uz som to "narouboval" na… poslední
truhlik 05.03.2022 18:51
truhlik

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

Když jsem si to zkoušel, tak se to podle mne chová dle potřeby
Mezisoučty mají ID = null, takže prázné.

declare @tTemp table (ID int identity primary key, Skupina int, Nazev char(10), Pocet int)
insert into @tTemp (Nazev, Skupina, Pocet) values
	('Jedna', 1, 10),
	('Dva', 1, 15),
	('Tri', 2, 5),
	('Ctyri', 2, 12)

select * from @tTemp

SELECT ID, Skupina, Pocet = Sum(Pocet)
FROM @tTemp
GROUP BY
	GROUPING SETS (
		(Skupina, ID),
		(Skupina),
		()
	)
ORDER BY
	Skupina,
	1;

Pokud tam chceš ít nulu, tak to stačí ošetřit, případně i u názvů:

SELECT ID = IsNull(ID, 0), Skupina, Pocet = Sum(Pocet)
FROM @tTemp
GROUP BY
	GROUPING SETS (
		(Skupina, ID),
		(Skupina),
		()
	)
ORDER BY
	Skupina,
	1;

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

select ID = Identity(int, 1, 1), *
into #Pokus
from @tTemp; 

SELECT ID = IsNull(ID, 0), Skupina, Pocet = Sum(Pocet)
FROM #Pokus
GROUP BY
	GROUPING SETS (
		(Skupina, ID),
		(Skupina),
		()
	)
ORDER BY
	Skupina,
	1;

Problem by mohl byt pri vicenasobnem spusteni, pokud zustane zachvana connection - existence pomocne tabulky.
Pak by za strednikem mohl nasledovat jeste prikaz:

if not Object_ID('tempdb..#Pokus') is null drop table #Pokus

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.

declare @tTemp table (Skupina int, Nazev char(10), Pocet int)
insert into @tTemp (Nazev, Skupina, Pocet) values
	('Jedna', 1, 10),
	('Dva', 1, 15),
	('Tri', 2, 5),
	('Ctyri', 2, 12)


SELECT ID, Skupina, Pocet = Sum(Pocet)
FROM (select ID = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), * from @tTemp) a
GROUP BY
	GROUPING SETS (
		(Skupina, ID),
		(Skupina),
		() )
ORDER BY
	Skupina, 1;

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;

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
;

Zpět do poradny Odpovědět na původní otázku Nahoru