Avatar billede Slettet bruger
12. februar 2015 - 13:39 Der er 7 kommentarer og
1 løsning

joine måneder på manglende data

Hej,

Jeg har et spm. Jeg ved ikke hvordan jeg skal joine ekstra måneder på mit dataset som jeg mangler

Data jeg har nu

Felt,Måned,Value
A,1,200
A,4,400
A,8,900

Det jeg mangler er at jeg kan få
Felt,Måned,Value
A,1,200
A,2,0
A,3,0
A,4,400
A,5,0
A,6,0
A,7,0
A,8,900
A,9,0
A,10,0
A,11,0
A,12,0

Jeg har en dato tabel ved siden af som indeholder Alle år og måneder
Avatar billede Slettet bruger
12. februar 2015 - 14:03 #1
Du skal bruge OUTER JOIN
Avatar billede jakobdo Ekspert
12. februar 2015 - 16:31 #2
Nu er mysql garanteret ikke magen til.
Men i mysql ville det være ala:

SELECT dato.year, dato.month, data.value
FROM dato LEFT JOIN data ON dato.year = data.year and dato.month = data.month
ORER BY dato.year, dato.month
Avatar billede Slettet bruger
21. maj 2015 - 15:32 #3
Leder du efter sådan noget her:


with dato as (

select distinct MONTH as Måned from dbo.dato
)



,data as (
SELECT  [Felt]
      ,måned
      ,[Value]
  FROM [Testdata].[dbo].[Testdata]

  )

select distinct a.Måned,isnull(b.felt,'a') as felt ,isnull(b.Value,0) as Value from dato a  left join data  b on a.Måned = b.Måned
Avatar billede kjulius Novice
23. juni 2015 - 20:17 #4
Som de andre også er inde på, så kan du bruge den tabel med ÅR og måneder du skriver, at du har. Siden du i dit eksempel slet ikke bruger ÅR, ville det nok være endnu mere hensigtsmæssigt at oprette en ny tabel kun med månedsnumre. Hvis vi tager udgangspunkt i en sådan månedstabel med 12 rækker, så ville en forespørgsel kunne se sådan ud:

SELECT f.Felt, m.Måned, d.Value
FROM dbo.felter AS f
CROSS JOIN dbo.måneder AS m
LEFT JOIN dbo.data AS d
    ON d.måned = m.måned AND d.felt=f.felt

Som du kan se, har jeg taget udgangspunkt i, at du også har en tabel med de mulige værdier for feltet Felt. For ellers vil det være svært at få det propageret med til forespørgslen.

Hvis du ikke på forhånd ved, hvilket værdier Felt kan antage, eller du kun vil have de Felt-værdier vist, som dine data rent faktisk indeholder, vil du kunne gøre det sådan:

WITH DataFelter AS (
SELECT DISTINCT Felt
FROM dbo.Data)

SELECT f.Felt, m.Måned, d.Value
FROM DataFelter AS f
CROSS JOIN dbo.måneder AS m
LEFT JOIN dbo.data AS d
    ON d.måned = m.måned AND d.felt=f.felt

Som PlaidDK allerede har vist, vil du på samme måde kunne bruge månederne fra din MånedÅr tabel, hvis du skulle ønske at gå den vej:

WITH
DataFelter AS (
SELECT DISTINCT Felt
FROM dbo.Data),

Måneder AS (
SELECT DISTINCT Måned
FROM dbo.MånedÅr)

SELECT f.Felt, m.Måned, d.Value
FROM DataFelter AS f
CROSS JOIN Måneder AS m
LEFT JOIN dbo.data AS d
    ON d.måned = m.måned AND d.felt=f.felt
Avatar billede kjulius Novice
23. juni 2015 - 20:31 #5
... og siden du gerne vil have vist et 0, når der ikke er data, skal vi lige have konverteret NULL til et 0:

WITH
DataFelter AS (
SELECT DISTINCT Felt
FROM dbo.Data),

Måneder AS (
SELECT DISTINCT Måned
FROM dbo.MånedÅr)

SELECT f.Felt, m.Måned, COALESCE(d.Value, 0) AS Value
FROM DataFelter AS f
CROSS JOIN Måneder AS m
LEFT JOIN dbo.data AS d
    ON d.måned = m.måned AND d.felt=f.felt

(jeg bruger generelt altid COALESCE som er mere sql-standard, men du kan selvfølgelig også bruge ISNULL funktionen, sådan som plaidDK gør i sit svar - det er en smagssag)
Avatar billede Slettet bruger
24. juni 2015 - 10:51 #6
Det her er rimelig stivt.

Har jeg svaret på mit eget spm jeg har oprettet? HAhaha :D Shit mand :D

Kæmpe kåger!
Avatar billede kjulius Novice
25. juni 2015 - 12:28 #7
Ja, det kan jo ske. :-)
Avatar billede Slettet bruger
25. juni 2015 - 13:12 #8
Det er lidt skørt ! :)

Men jeg havde jo egentlig selv løst det, men for din effort og dejlige crossjoin så får du pointene :)
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