Datumswerte erstellen aus verschiedenen Spalten

Hallo,

ich habe eine Datenbank mit Spalten in dem das Jahr und der Monat in Zahlen dargestellt sind. Das ist noch nicht das Problem, aber es gibt dann nochmals 31 Spalten und in jeder Spalte sind dann die Zeitwerte die ich zusammenrechnen muss.

Jahr----Monat-----Tag1----Tag2----Tag3----…
2010----4-----------7:30-----8:00-----7:45----…
(sorry für die Darstellung,war jetz auf die schnelle)

aus diesen Daten sollte ich ein Datum erstellen das ich nachher für Perioden-Abfragen für OLAP benötige.
Ich komm irgendwie nicht drauf, wie ich nun die Spalten, z.B. Tag1 als 1 darstelle und würde dann nur den Tag, Monat und Jahr verbinden, z.B. so: ‚Tag1‘+’.’+‚Monat‘+’.’+‚Jahr‘, dann würde aber bei mir dies rauskommen: 7:30.4.2010, aber ich möchte ja statt der 7:30 eine 1 stehen haben.

Bin für jeden Tip dankbar.

Hoffe mir kann jemand helfen.

Vielen Dank schon mal,
Grüße
Bernd

Hey Ho,…
Wieso gibt es denn 31 Spalten? Für jeden Tag eine…
Besser wäre hier:
|Tag|
|1 |
|2 |
|…|
Für jeden Tag dann extra die Uhrzeit. Somit wäre das Problem gelöst.
Dann könntest du den Inhalt nehmen. Ich verstehe hier den Sinn nicht…
Leider kann ich dir nicht weiterhelfen bezüglich Uhrzeit und Tag.
Vielleicht gibts so ne Möglichkeit den Tabellenname zu splitten und alles was nach „Tag“ kommt in ne Varibale zu schreiben und ausgeben zu lassen… Ne andere Idee hab ich leider nicht :frowning:
Grüßl, Momo

Hallo Momo,

ja, leider, aber den Sinn verstehe ich selber nicht.
Dies ist von einer Programmierfimrma angefertigtes Programm mit ner Access-DB und ich muss für Analyse-Zwecke nun die Daten in eine SQL-Datenbank importieren und dafür views anlegen. Das Datum selbst ist kein Problem, aber wie ich die 1 für Tag1 und 2 für Tag2 usw… am besten löste weiss ich noch nicht.

Grüße

Bernd

Moin, hasna,

Du könntest den Umweg über eine Excel-Tabelle gehen, dort gibt es die Funktion Transponieren, die erstmal Spaltenwerte in Zeilen umsetzt. Dann hast Du Datum und Uhrzeit, wie es sich gehört.

Ganz nebenbei gesagt: Eine derartige Datenstruktur gehört dem Lieferanten vor die Füße gekippt, dazu gleich noch ein Hausverbot.

Gruß Ralf

Hallo Ralf,

hast recht, aber ich muss gerade leider mit dem arbeiten was ich hab :frowning:.
Das Problem ist, dass es noch mehr solche skurilen Tabellen gibt die ich aber auch zum verknüpfen brauche.
Die DB lass ich täglich über SSIS auf meinen SQL-Server laufen und der Cube wird täglich über Nacht aufbereitet.
Also mit transponieren ist es so eine Sache, wenn es nur 1x wäre ja, aber vielleicht ist es auch über SQL möglich, das weiß ich leider nicht.
Es handelt sich auch um über 80000 Sätze.
Trotzdem, danke für den Tip!

Grüße

Bernd

Servus,

wie wäre es mit so einer Lösung (so was wie CASE hat deine DB doch ?):

SELECT date( jahr, monat,
CASE WHEN tag1 ’ ’ THEN 01
WHEN tag2 ’ ’ THEN 02

WHEN tag31 ’ ’ THEN 31
END AS tag )
FROM tabelle

Hilft dir dieser Ansatz weiter ?

Gruss,
SomeOne

Hallo SomeOne,

danke für die Hilfe!
Ja, klar, der Ansatz hilft mir schon weiter, jedoch denke ich wenn ich Case einsetze werden mir ja die Tabelleninhalte auf 01, 02… gesetzt, aber da habe ich ja die Werte drin, oder sehe ich das falsch?

Grüße

Bernd

Hallo Bernd,
ja du hast Recht … hmmm … grübel …

und wenn du mit (Syntax laut deiner DB)

CREATE TABLE hilfstabelle AS

SELECT date( jahr, monat,
CASE WHEN tag1 ’ ’ THEN 01
WHEN tag2 ’ ’ THEN 02

WHEN tag31 ’ ’ THEN 31
END AS tag )
,
CASE WHEN tag1 ’ ’ THEN tag1
WHEN tag2 ’ ’ THEN tag2

WHEN tag31 ’ ’ THEN tag31
END AS zeit )
FROM tabelle

eine Ausgabedatei erzeugst ?

Die hätte dann die Spalten jahr, monat, tag, zeit …

Geht das so was du machen willst ?

Gruss,
SomeOne

Guten Tag,

Hallo SomeOne,

mhhh, ja, das ist nicht schlecht, aber hätte ich somite nicht für alle 31 Tage dann nochmals zusätzlich in der tmp-Tabelle 31 Spalten? Ich glaub so verstehe ich es, aber berichtige mich wenn ich falsch liege.
Also, dann hätte ich ca. 80000 Zeilen x 31 zusätzliche Spalten, oder sehe ich das falsch?

Grüße

Bernd

Hallo Bernd,

es ist noch viel schlimmer, meine erste Idee ist totaler Quatsch weil die Abfrage nur eine einzige Ergeniszeile geliefert hätte.

Hier jetzt aber mal die soeben erfolgreich getestete Idee:

SELECT jahr, monat, CASE WHEN tag01 0 THEN 1 END AS tag,
CASE WHEN tag01 0 THEN tag01 END AS tag01#
FROM tablle
UNION ALL
SELECT jahr, monat, CASE WHEN tag02 0 THEN 2 END AS tag,
CASE WHEN tag02 0 THEN tag02 END AS tag02#
FROM tablle
UNION ALL
SELECT jahr, monat, CASE WHEN tag03 0 THEN 3 END AS tag,
CASE WHEN tag03 0 THEN tag03 END AS tag03#
FROM tablle
UNION ALL
SELECT jahr, monat, CASE WHEN tag04 0 THEN 4 END AS tag,
CASE WHEN tag04 0 THEN tag04 END AS tag04#
FROM tablle

etc bis 31

Diese Abfrage liefert dir eine Tabelle mit Jahr, Monat, Tag, Feldwert , und du kannst sie wie gewohnt verarbeiten.
Ach ja, Jahr, Monat, Tag muss du noch in ein Datum konvertieren .

Gib mal Rückmeldung ob das dein Problem löst, bin gespannt.

Gruss,
SomeOne

Guten Tag,

Hallo SomeOne,

das probier ich morgen aus, gebe Dir Bescheid, trotzdem herzlichen Dank schon mal im voraus für Deine Mühe!!

Viele Grüße

Bernd

Guten Tag,

Hallo SomeOne,

super, hat geklappt, herzlichen Dank!
Muss dann noch ein bißchen am Format was ändern, aber das krieg ich hin.

select
cast(CONVERT(varchar,jahr) + ‚.‘+convert(varchar,Monat)+ ‚.‘+convert(varchar,Tag) as date) Datum

from dbo.Datum_Test

Ergebnis:
Datum
2010-11-22
2010-04-20
2010-05-22

Genial!!!

Viele Grüße

Bernd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

*freu*
Hallo Bernd,

dass du das Datum noch ein wenig modifizieren musstest war klar …

Freut mich dass die grundsätzliche Lösungsidee gegriffen hat, danke für die Rückmeldung.

Viel Erfolg noch bei der weiteren Verarbeitung.

Gruss,
SomeOne

Hallo SomeOne,

ja, vielen Dank
und viele Grüße

Bernd