Summere rækker

Tags:    databaser

Hej, jeg har brug for lidt hjælp til mit SQL.
Jeg har 3 kolonner baseret på en query som kommer ud som følger:
AAL AKL OS
AAL AKL TG
AAL CAN LH
AAL CAN TG
AAR AKL OS
AAR AKL TG
Og jeg kunne virkelig godt tænke mig at det kom ud sådan her:
AAL AKL OS,TG
AAL CAN LH,TG
AAR AKL OS,TG
Nogle der har nogle kreative forslag? :)




Indlæg senest redigeret d. 22.06.2006 16:01 af Bruger #10164
8 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Ok, jeg troede du ville lave et sql kald hver eneste gang hvor du brugte din stored procedure til at akkumulere ... men når du laver en cache tabel eller hvad man skal kalde den, så sparer du en masse CPU på SQL serveren såvel som asp serveren.

Lyder overhovedet ikke ufornuftigt!

Så kunne det måske være en ide at lave en stored procedure som tager 100 % hånd om tingene?

Indhold:

tjek om "cache" tabellen findes
hvis ikke, fyr "create table ..." sql af
hvis, tøm tabellen

lav en cursor af "select distinct BY1, BY2 from DONKEYKONG" - cursor a

lav en inner cursor af "select distinct SELSKAB from DONKEYKONG where BY1 = a:BY1 and BY2 = a:BY2" - cursor b (jeg er ikke 100 % sikker på den der cursor a reference i cursor b syntax, men hvis ikke det er :, er det . eller noget andet)

loop cursor a

rens tmp var

loop cursor b

akkumuler cursor b værdi til tmp var

loop cursor b slut

insert into "cache_table"(BY1, BY2, SELSKAB) values a:BY1, a:BY2, tmp

loop cursor a slut

Slå syntaxen op for T-SQL ... det er lidt BASIC agtigt, men ellers tæt på almindeligt SQL.

Du skulle ihvertfald gerne have en råskitze på en opskrift :)

Velbekomme :D



øhh, giv en smule mere at arbejde med.

Hvordan ser din sql ud nu?
Hvordan ser din(e) tabel(er) ud?



Min fejl, skal nok uddybe noget mere :)
Antag at tabellen ser således ud her:

BY1 BY2 SELSKAB
----------------
AAL AKL OS
AAL AKL TG
AAL CAN LH
AAL CAN TG
AAR AKL OS
AAR AKL TG

Som man kan se i ovenstående så er den eneste forskel på de første to rækker:
AAL AKL OS
AAL AKL TG
at det er to forskellige selskaber.

Det jeg efterlyser er en måde hvorpå jeg kan reducere rækkerne med SQL via en stored procedure, query, således at selskaberne bliver samlet i en kolonne kun sepereret af et komma.

BY1 BY2 SELSKAB
----------------
AAL AKL OS,TG
AAL CAN LH,TG
AAR AKL OS,TG

Det skal nævnes at den fulde tabel er på ca. 2000 rækker deraf grunden til at jeg vil reducere den for at lette loadningen på SQL serveren.
Håber det hjælper lidt.

Tilføjede lige tabel kode. Har ikke testet om den virker.
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 22.06.2006 18:24 af Bruger #10164
Det er intet problem at lave en stored procedure, som tager BY1 og BY2 som parametre og leverer en liste af SELVSKAB værdier som denne BY1 og By2 kombination.

Men hvis ideen er at lette SQL serveren, så tror jeg ikke det letter, tvært imod.

Du skal selecte distinct BY1, BY2, i en inner select, i den ydre selecter du ugen BY1, BY2, samt DinStoredProcedure(BY1, BY2).
Alene her er arbejdet nok ikke mindre, og medregne skal du al den sql og andet arbejde som foretages inde i din stored procedure for hver eneste række af resultater.

Jeg tror ikke det vil lette.

Så spørgsmålet er måske også, er målet du vil opnå noget andet end bare at lette SQL serverens arbejde?

Man kan ofte gøre tingene på mere end en enkelt måde :)



Det er intet problem at lave en stored procedure, som tager BY1 og BY2 som parametre og leverer en liste af SELVSKAB værdier som denne BY1 og By2 kombination.

Men hvis ideen er at lette SQL serveren, så tror jeg ikke det letter, tvært imod.

Du skal selecte distinct BY1, BY2, i en inner select, i den ydre selecter du ugen BY1, BY2, samt DinStoredProcedure(BY1, BY2).
Alene her er arbejdet nok ikke mindre, og medregne skal du al den sql og andet arbejde som foretages inde i din stored procedure for hver eneste række af resultater.

Jeg tror ikke det vil lette.

Så spørgsmålet er måske også, er målet du vil opnå noget andet end bare at lette SQL serverens arbejde?

Man kan ofte gøre tingene på mere end en enkelt måde :)


Det vil jo lette arbejdet da det hele skulle ende med en ny tabel der bliver væsentlig mindre end den oprindelige. Den ny tabel skal måske opdateres 2-3 gange om dagen. Så det er ikke så tit den skal køre den store samle række ting igennem.
Samtidig bliver data mere repræsentable i den nye tabel og gør det væsentlig lettere for den side der skal returnere værdierne.
Ovennævnte udsnit af tabellen er en lille del af den totale. I den rigtige kan der være virkelig mange selskaber pr. by kombination og jeg kan derved komprimere det fra 10 linier på et bypar til 1 linie med , som seperator.
Det vil give en mega besparelse af rækker den skal returnere til den stakkelse .asp side.

Jeg er lidt træt, så hvis det ikke giver så meget mening må du sige til :)



Kunne ikke lade være ... faldt lige over denne her:

http://jackdonnell.com/articles/SQL_CURSOR.htm

Det er jo næsten identisk med den kode du skal lave!!
Ok, ikke helt så, men der er et skelet og du ser hvordan du skal lave basal T-SQL stored procedure.

Hvis jeg falder over et eksempel med cursor til cursor referencer i T-SQL skal jeg nok poste det her.



Helt pænt blev det ikke, så det kunne nok gøres bedre, men her er ihvertfald et eksempel på hvordan man kunne lave en inner cursor som referer til en yder cursor:

http://doc.ddart.net/mssql/sql70/de-dz_3.htm

Ja, smukt ser det som sagt ikke ud, men det er jo T-SQL :D (eller også verdens dårligeste eksempel)



Helt pænt blev det ikke, så det kunne nok gøres bedre, men her er ihvertfald et eksempel på hvordan man kunne lave en inner cursor som referer til en yder cursor:

http://doc.ddart.net/mssql/sql70/de-dz_3.htm

Ja, smukt ser det som sagt ikke ud, men det er jo T-SQL :D (eller også verdens dårligeste eksempel)


Først vil jeg lige takke for dine konstruktive input ! :)

Løsningen jeg har fundet frem til er dog en smule anderledes og skal pudses lidt af, men jeg ved hvad vej jeg vil gå nu.

Fold kodeboks ind/udKode 

Får at få listen:
Fold kodeboks ind/udKode 




t