Avatar billede komputerdk Mester
15. juni 2016 - 12:38 Der er 14 kommentarer

fra antal pr. ugedag til antal pr. dag resten af året

Hej

jeg har en tabel med følgende records

IDnr, antal mandag, antal tirsdag ... antal  søndag

så f.eks.
IDnr
24, har så 1 i antal mandag, 1 i antal tirsdag og 0 i resten

jeg har så også en kalender tabel med

Dato, ugedag (1=søndag) , mandag, tirsdag ..søndag

hvor der står 1 i den uge dag det er.. så den 7/7-2016 = 1 i torsdag.

hvordan laver jeg nemt en ny tabel hvor jeg har

Dato, IDnr, antal

så IDnr 24 er der en record for hver dato der er en mandag eller tirsdag og med antal

tak for forhånd
Avatar billede petersen7913 Forsker
15. juni 2016 - 13:13 #1
Hm ... dette er som jeg tolker dit spørgsmål:

Du ønsker en tabel, hvor man kan slå op på 'mandag' og så få en liste med alle datoer, der er mandag - rigtigt?

Det kan du gøre ved at have en mastertabel med 7 records, en for hver ugedag, og så en detailtabel, der skal indeholde de konkrete datoer.

Tabel Ugedage
ID autonum
Dag tekst (mandag, tirsdag....)

Tabel Datoer
ID autonum
UgedagID refererer til tabel Ugedag
Dato (som nok IKKE skal hedde 'Dato' eller 'Date'...)

Og så lidt kode til at læse de konkrete datoer ind. Og lidt overvejelser mht. hvilke år du vil ha med.

Men hvad er formålet med at ha en kalender opdelt på den måde?
Avatar billede komputerdk Mester
15. juni 2016 - 13:36 #2
#1
Det er ikke en optimal måde - men sådan var rådata desværre :(

man kan også lave noget datepart(dw,dato) i kalender tabellen..

jeg ønsker en tabel hvor hvis fx. ID 24 har 1 i mandag og 1 i tirsdag - så er der en linje i tabellen for hver mandag og tirsdag
i forhold til de datoer der er i kalender  (de indeholder et halvt år)


jeg kan lave det lidt a la , men den skal jeg så lave syv gange.. og ændre det i fed hver gang..

Insert into ResultatTabel

Select
samlet.dato
,Samlet.ID
,Samlet.Antal
From

(Select
ID
,sum(AntalMandag) as Antal
from Levering
where levering.sum(AntalMandag) >0
group by ID

Cross Join
(select dato from
Kalender
where ugedag=2)

) as Samlet
Avatar billede petersen7913 Forsker
15. juni 2016 - 13:49 #3
Jeg forstår stadig ikke hvad det er du vil opnå????

Prøv at beskrive - i ord - hvad du har brug for. Og glem alt om VBA koden ;)

Lidt som 'jeg har .... data og jeg skal .... vise et eller andet på skærmen'
Avatar billede komputerdk Mester
15. juni 2016 - 15:10 #4
jeg har en liste med kunder som får leveringer forskellige dage i løbet af ugen (dvs. kun ugedagene, ikke datoerne).

jeg har også en tabel med åbningsdage= datoer (mulige leveringer)

for at lave planlægning , skal jeg vide hvilke kunder der skal have leveringer hvilke datoer
Avatar billede petersen7913 Forsker
15. juni 2016 - 15:25 #5
Der er en lidt lignende snak her - gammelt spørgsmål. det er godt nok i Excel, men kunne inspirere ;)

http://www.computerworld.dk/eksperten/spm/753232
Avatar billede petersen7913 Forsker
15. juni 2016 - 15:37 #7
Udpenslet eksempel:

SELECT distinct date() as Idag,
Weekday(Idag) AS DagNr,
WeekdayName(DagNr) as DagNavn
from job;

Skrevet sammen og med stort begyndelsesbogstav:
SELECT distinct StrConv(WeekdayName(Weekday(date())), 3) as DagNavn
from job;
Avatar billede terry Ekspert
15. juni 2016 - 16:34 #8
In SQL Server you can use these functions to get day number and name from date
https://msdn.microsoft.com/en-us/library/ms174420.aspx
https://msdn.microsoft.com/en-us/library/ms174395.aspx
Avatar billede komputerdk Mester
15. juni 2016 - 16:41 #9
tror du misforstår mig/ jeg forklarer mig uklart.. det er ikke et spørgsmål om at køre fra en dato til en dag (som tekst)..

det klarer datepart(dw, enDato) fint.

jeg kan også kode det i VBA i excel, men der kommer der en begrænsning med antallet af celler.. og ideen at det skulle laves i (T)SQL (på en SQL server 2005)

det er et spørgsmål om hvordan man laver et cross join med et sæt dynamiske kriterier, så hvis der er >0 i en "kolonne" der viser antal om mandagen, så skal det antal gå igen alle mandage indenfor de datoer der er i "kalender" tabellen.
Avatar billede terry Ekspert
15. juni 2016 - 17:21 #10
"det er ikke et spørgsmål om at køre fra en dato til en dag (som tekst).."
I'm aware of that but I still haven't quite understood the question :-(

Try giving a more detailed example of your data (tables/fields/contents) and then a detailed example of what you want to see in the result.
Avatar billede komputerdk Mester
16. juni 2016 - 22:04 #11
Eksempel (første linje er overskrifter, anden, tredje etc er data)

Tabel 1  (kundeID, og antal leverinder den pågældende dag)
ID  | Mandag | Tirsdag | Onsdag |
24 |      1      |      0      |      3    |

tabel 2 (kalender / åbningsdag, dag 1 = søndag)
Dato        | ugedag |
13/06/16  |    2      |
14/06/16  |    3      |
15/06/16  |    4      |
20/06/16  |    2      |
21/06/16  |    3      |
22/06/16  |    4      |

Resultat
Dato        | ID  | antal |
13/06/16  | 24 |    1  |
15/6/16  | 24 |    3    |
20/06/16  | 24 |    1  |
22/06/16  | 24 |    3  |

(Disse vises ikke da antal = 0 / ikke i kalenderen)
14/06/16  | 24 |    0  |
16/06/16  | 24 |    0  |
17/06/16  | 24 |    0  |
18/06/16  | 24 |    0  |
19/06/16  | 24 |    0  |
11/06/16  | 24 |    0  |
Avatar billede komputerdk Mester
16. juni 2016 - 22:05 #12
| = ny kolonne
Avatar billede petersen7913 Forsker
17. juni 2016 - 09:39 #13
Lidt overvejelser: du behøver ikke at have en tabel med datoer og ugedag.

For at indsætte records i Resultat-tabel kunne du lave et loop lidt som det her:

startdato = i dag
slutdato = om 6 måneder
loop så længe dato er før slutdato
  find ugedag for dato
  find de kunder, der har en levering på den ugedag
  sæt dato, kunden og leveringen ind i Resultat
  næste dato
end loop
Avatar billede terry Ekspert
20. juni 2016 - 08:49 #14
The following is done in Access SQL but its straightforward SQL so it should work in SQL Servere too.

Theres an inner SQL which is just getting kunde data structured correctly by using a UNION JOIN, then its just a case of joining the kalender table on to the derived table and sorting/filtering to give desired result.

SELECT kalender.Dato, Kunde.ID, Kunde.Antal
FROM kalender INNER JOIN (SELECT ID, UgeDag, Antal
FROM (SELECT ID, 2 as UgeDag, Mandag as Antal
FROM kunde
UNION
SELECT ID, 3 as UgeDag, Tirsdag as Antal
FROM kunde
UNION
SELECT ID, 4 as UgeDag, Onsdag as Antal
FROM kunde)  ) as Kunde ON kalender.ugedag = Kunde.UgeDag
WHERE (((Kunde.Antal)>0))
ORDER BY kalender.Dato, Kunde.ID;
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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



IT-JOB