11. september 2012 - 13:20Der 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.
#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.
....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.
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;
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.
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]
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 :) )
#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.
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.