Avatar billede ravelab Praktikant
11. september 2012 - 13:20 Der er 10 kommentarer og
1 løsning

Omstrukturering af tabel via SQL kode

Jeg vil gerne omstrukturere en tabel der har samme info bare fordelt ud over flere felter.

Tabellen er bygget op på følgende måde ca. Vi har en masse data, hvor der er grupperingen af data f.eks. A1 og A2 (Samme info) med tilhørende dato1, dato2 osv. Så det vil sige at alle 1'ere høre sammen og 2'erne høre sammen, samt at rækken også har fælles informationer til dem begge.

Det jeg vil gøre er at sorter mine data om så alle A1 og A2 (Hvis A1 er NULL er alle tilhørende 1'er NULL og det samme gælder for A2) komme til at ligge under A med deres tilsvarende data, som så også kommer til at få fælles navne, såsom dato1 og dato2, som nu vil høre under dato. Derudover skal fælles data på rækkerne kopieres over i begge nye oprettet rækker efter den nye struktur.

Og for at identificere de tidligere 1'ere og 2'ere opretter jeg et nyt felt, som indeholder 1 eller 2 alt efter hvilke informationer den givende række hørte til. Denne del af opgaven har jeg styr på, men dette gøres igennem en Case When tilgang.

Håber min beskrivelse er forstålig nok ellers skal jeg nok komme med flere eksemplar på min problematik.
Avatar billede janus_007 Nybegynder
11. september 2012 - 20:43 #1
Alt for meget at læse og alt for mange spørgsmål...

Lav noget demodata.. hvad har du? og hvor vil du ende?
Avatar billede ravelab Praktikant
11. september 2012 - 21:31 #2
#1 Hermed får du et link til nogle hjemmelavet demo data i excel, men tanken er den samme. Her kan du se hvordan det er nu og hvad det ønsket output skal være.

http://i50.tinypic.com/11uxqg7.jpg

På forhånden tak for hjælpen.
11. september 2012 - 21:30 #3
....eller for at tage det helt konkret:  giv os opbygningen af tabellen, hvilke felter der er og eksempler på indholdet, som den er nu og den opbygning du sigter på og hvordan dataerne skal se ud i den omformede tabel.  Så er der chancer for at vi finder ud af det.
12. september 2012 - 07:49 #4
Det var godt med demo dataerne.  Et billed siger mere end 1000 ord.

Jeg overså, at spørgsmålet drejer sig om mssql - den har jeg ikke installeret, kun mysql.  Men den generelle fremgangsmåde kunne være, at du opretter en ny tabel, Table2, med de rigtige kolonner og så flytter du værdierne fra Table1 over til Table2 i to omgange, først de rækker med en værdi i A1, og derefter de rækker med en værdi i A2, for eksempel

først

INSERT INTO Table2(Account, A, Start_dato, stop_dato, invoice, A_ID) SELECT Account, A1, Start_dato1, stop_dato1, invoice, 1 FROM ravelab1 WHERE A1 IS NOT NULL;

og derefter

INSERT INTO ravelab2(Account, A, Start_dato, stop_dato, invoice, A_ID) SELECT DISTINCT Account, A2, Start_dato2, stop_dato2, invoice, 2 FROM ravelab1 WHERE A2 IS NOT NULL;
Avatar billede ravelab Praktikant
12. september 2012 - 08:02 #5
Kan det gøres uden at oprette nye tabeller? Altså i stryk kode? Det behøver ikke at være skrevet i ms SQL, så længe det er SQL så skal jeg prøve at få testet det af.

Men vil lige teste kode af her sener på dagen.
Avatar billede ravelab Praktikant
12. september 2012 - 10:34 #6
Hmm hvad med at køre flere separate queries og derefter lave en "union" på dem?
Avatar billede ravelab Praktikant
12. september 2012 - 12:47 #7
Så drenge og piger, så tror jeg at jeg har fundet en løsning på problemet, men det kunne være rart hvis dette kunne blive bekræftet. Håber ikke at der er nogen rækker der går tabt på denne måde :S

SQL Kode:

SELECT [ID]
,[account]
,CASE
WHEN [A1] IS NOT NULL THEN [A1]
END AS 'A'
,CASE
WHEN [A1] IS NOT NULL THEN '1'
ELSE NULL
END AS 'A_ID'
,[start_date1] AS 'start_date'
,[stop_date1] AS 'stop_date'
,[invoice]
FROM [dbo].[info]

WHERE [A1] IS NOT NULL

UNION ALL

SELECT [ID]
,[account]
,CASE
WHEN [A2] IS NOT NULL THEN [A2]
END AS 'A'
,CASE
WHEN [A2] IS NOT NULL THEN '2'
ELSE NULL
END AS 'A_ID'
,[start_date2] AS 'start_date'
,[stop_date2] AS 'stop_date'
,[invoice]
FROM [dbo].[info]

WHERE [A2] IS NOT NULL
Avatar billede janus_007 Nybegynder
12. september 2012 - 19:19 #8
Ja en union er fin og nok den bedste måde at klare det på. Man kunne måske pivotere det, meeenn union er langt mere simpel til det her.

Men dine cases er lidt sjove, du spørger på IS NOT NULL i begge, det er lidt underligt :)

Jeg ville gøre sådan her:

select id, account, A1, startdate1, stopdate1, invoice, 1 as A_ID where A1 is not null
union
select id, account, A2, startdate2, stopdate2, invoice, 2 where A2 is not null

(du behøver ikke aliaser i din nedre union, dem styrer man i den første kun :) )
Avatar billede ravelab Praktikant
12. september 2012 - 19:51 #9
#8 Hvis du kan lave et svar med pivotere så får du point. Det er mere til en dag hvor jeg evt. kan komme til at få brug for netop denne tilgang til SQL.

På forhånden tak.
Avatar billede janus_007 Nybegynder
12. september 2012 - 22:22 #10
Nope... det kan jeg ikke :)

Opgaven er løst, pivot er noget jeg selv foreslog ;-)
Avatar billede janus_007 Nybegynder
12. september 2012 - 22:22 #11
Så her :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester