ALTER TABLE: was mach ich falsch?

Werbung:
Wie gesagt meine Fähigkeiten in SQL sind nur rudimentär. Aber alles in einer Abfrage zu stecken überschreitet meine Fähigkeiten. Überhaupt die erste Ansicht schon hinzubekommen war sehr schwer. Selbst wenn ich das aktuelle Problem gelöst bekomme müsste ich noch immer schauen wie ich die Werte von Anfang des Jahres bis jetzt dargestellt bekomme und Tag für Tag aufsummiert dargestellt bekomme.

Würdest du mir wenigstens bei meinen aktuellen Problem helfen?

Der erste Schritt sah übrigen so aus:
Code:
Drop Table S_92620
DECLARE    @kopf varchar(100),
        @query VARCHAR(2000)

SET @kopf = (Select Case When DateName(dw
,    GetDate()) = 'Montag' Then 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day
,    -3
,    GetDate()),104) Else 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day
,    -1
,    GetDate()),104) End
);
SET @query =
'Select
    [S_92591_1].[Kontenart]
,    [S_92591_1].[Saldo] as ''' + @kopf+'''
into S_92620
From     [dbo].[S_92591] As [S_92591_1]
Where    [S_92591_1].[wBuch_Buchung_am] = Case When DateName(dw
,    GetDate()) = ''Montag'' Then Convert([nvarchar](10),DateAdd(day
,    -3
,    GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
,    -1
,    GetDate()),104) End
And    [S_92591_1].[wBuch_jahr] = Year(GetDate())
Order by [Kontenart] ASC'
EXEC(@query)

Und er funktionierte. Auf dieser Art wollte ich die folgenden Tage auch in die Tabelle bringen.
 
Das kann aber leider nicht das Ziel sein. Nicht nur weil ich die Veränderung zum Vortag sehen möchte (dann könnte ich ja mit Differenzen arbeiten) sondern weil ich tatsächlich jeden Tag benötige.
 
Doch, das löst genau alle deine Vorgaben. z.B.
Code:
SALDODATUM SALDO
1.2.2017  104,67
2.2.2017  7575,6
3.2.2017  7743,98
to be continued...

Wie du diese Daten dann auswertest bleibt dir überlassen, aber die Informationen sind da. Mit einem DATE Datentyp kann man übrigens auch Datumsberechnungen durchführen.
Es ist also kein Problem zu ermittel, ob der sounsovielte ein Montag war, oder sich die Salden aller Dienstage ausgeben zu lassen - und das alles mit nur einem SQL
 
Ok, so langsam dämmert es. Dann würdest du also die Kontengruppen als Spalten aufführen und wenn dann das Ergebnis da ist dieses in einer Sicht so aufarbeiten das es dann mein Wünschen entspricht. Tolle Idee. Auch wenn ich noch nicht weiß wie ich das umsetzen soll.

Sei doch mal so lieb und schick mir mal ein Code den ich dazu verwenden könnte die Ansicht so zu bekommen das ich nur noch am Design schrauben muss, hier mal mein Ansatz:

Code:
Select
    [S_92591_1].[wBuch_Buchung_am]
,    Sum([S_92591_1].[Saldo]) As [Saldo]
From     [dbo].[S_92591] As [S_92591_1]
Where    [S_92591_1].[wBuch_jahr] = Year(GetDate())
Group By    [S_92591_1].[wBuch_Buchung_am]
Order By    [S_92591_1].[wBuch_Buchung_am] ASC

Jetzt müsste ich nur noch eine Spalte mit 44 Case When Funktion einfügen oder?
 
So sieht nun mein Code aus. Eine Idee wie ich nun die Summierung Tag für Tag hinbekomme und evtl. wie ich neue Kontengruppen entdecke?

Code:
Select
    Top 100 Percent [S_92591_1].[wBuch_Buchung_am]
,    Sum(Case When [S_92591_1].[Kontenart] = '400' Then [S_92591_1].[Saldo] Else 0 End) As [400]
,    Sum(Case When [S_92591_1].[Kontenart] = '403' Then [S_92591_1].[Saldo] Else 0 End) As [403]
,    Sum(Case When [S_92591_1].[Kontenart] = '405' Then [S_92591_1].[Saldo] Else 0 End) As [405]
,    Sum(Case When [S_92591_1].[Kontenart] = '406' Then [S_92591_1].[Saldo] Else 0 End) As [406]
,    Sum(Case When [S_92591_1].[Kontenart] = '410' Then [S_92591_1].[Saldo] Else 0 End) As [410]
,    Sum(Case When [S_92591_1].[Kontenart] = '412' Then [S_92591_1].[Saldo] Else 0 End) As [412]
,    Sum(Case When [S_92591_1].[Kontenart] = '413' Then [S_92591_1].[Saldo] Else 0 End) As [413]
,    Sum(Case When [S_92591_1].[Kontenart] = '414' Then [S_92591_1].[Saldo] Else 0 End) As [414]
,    Sum(Case When [S_92591_1].[Kontenart] = '419' Then [S_92591_1].[Saldo] Else 0 End) As [419]
,    Sum(Case When [S_92591_1].[Kontenart] = '426' Then [S_92591_1].[Saldo] Else 0 End) As [426]
,    Sum(Case When [S_92591_1].[Kontenart] = '427' Then [S_92591_1].[Saldo] Else 0 End) As [427]
,    Sum(Case When [S_92591_1].[Kontenart] = '430' Then [S_92591_1].[Saldo] Else 0 End) As [430]
,    Sum(Case When [S_92591_1].[Kontenart] = '441' Then [S_92591_1].[Saldo] Else 0 End) As [441]
,    Sum(Case When [S_92591_1].[Kontenart] = '444' Then [S_92591_1].[Saldo] Else 0 End) As [444]
,    Sum(Case When [S_92591_1].[Kontenart] = '449' Then [S_92591_1].[Saldo] Else 0 End) As [449]
,    Sum(Case When [S_92591_1].[Kontenart] = '450' Then [S_92591_1].[Saldo] Else 0 End) As [450]
,    Sum(Case When [S_92591_1].[Kontenart] = '460' Then [S_92591_1].[Saldo] Else 0 End) As [460]
,    Sum(Case When [S_92591_1].[Kontenart] = '461' Then [S_92591_1].[Saldo] Else 0 End) As [461]
,    Sum(Case When [S_92591_1].[Kontenart] = '462' Then [S_92591_1].[Saldo] Else 0 End) As [462]
,    Sum(Case When [S_92591_1].[Kontenart] = '464' Then [S_92591_1].[Saldo] Else 0 End) As [464]
,    Sum(Case When [S_92591_1].[Kontenart] = '470' Then [S_92591_1].[Saldo] Else 0 End) As [470]
,    Sum(Case When [S_92591_1].[Kontenart] = '471' Then [S_92591_1].[Saldo] Else 0 End) As [471]
,    Sum(Case When [S_92591_1].[Kontenart] = '478' Then [S_92591_1].[Saldo] Else 0 End) As [478]
,    Sum(Case When [S_92591_1].[Kontenart] = '480' Then [S_92591_1].[Saldo] Else 0 End) As [480]
,    Sum(Case When [S_92591_1].[Kontenart] = '481' Then [S_92591_1].[Saldo] Else 0 End) As [481]
,    Sum(Case When [S_92591_1].[Kontenart] = '494' Then [S_92591_1].[Saldo] Else 0 End) As [494]
,    Sum(Case When [S_92591_1].[Kontenart] = '496' Then [S_92591_1].[Saldo] Else 0 End) As [496]
,    Sum(Case When [S_92591_1].[Kontenart] = '499' Then [S_92591_1].[Saldo] Else 0 End) As [499]
,    Sum(Case When [S_92591_1].[Kontenart] = '505' Then [S_92591_1].[Saldo] Else 0 End) As [505]
,    Sum(Case When [S_92591_1].[Kontenart] = '506' Then [S_92591_1].[Saldo] Else 0 End) As [506]
,    Sum(Case When [S_92591_1].[Kontenart] = '511' Then [S_92591_1].[Saldo] Else 0 End) As [511]
,    Sum(Case When [S_92591_1].[Kontenart] = '518' Then [S_92591_1].[Saldo] Else 0 End) As [518]
,    Sum(Case When [S_92591_1].[Kontenart] = '542' Then [S_92591_1].[Saldo] Else 0 End) As [542]
,    Sum(Case When [S_92591_1].[Kontenart] = '543' Then [S_92591_1].[Saldo] Else 0 End) As [543]
,    Sum(Case When [S_92591_1].[Kontenart] = '544' Then [S_92591_1].[Saldo] Else 0 End) As [544]
,    Sum(Case When [S_92591_1].[Kontenart] = '552' Then [S_92591_1].[Saldo] Else 0 End) As [552]
,    Sum(Case When [S_92591_1].[Kontenart] = '554' Then [S_92591_1].[Saldo] Else 0 End) As [554]
,    Sum(Case When [S_92591_1].[Kontenart] = '556' Then [S_92591_1].[Saldo] Else 0 End) As [556]
,    Sum(Case When [S_92591_1].[Kontenart] = '564' Then [S_92591_1].[Saldo] Else 0 End) As [564]
,    Sum(Case When [S_92591_1].[Kontenart] = '565' Then [S_92591_1].[Saldo] Else 0 End) As [565]
,    Sum(Case When [S_92591_1].[Kontenart] = '576' Then [S_92591_1].[Saldo] Else 0 End) As [576]
,    Sum(Case When [S_92591_1].[Kontenart] = '591' Then [S_92591_1].[Saldo] Else 0 End) As [591]
,    Sum(Case When [S_92591_1].[Kontenart] = '598' Then [S_92591_1].[Saldo] Else 0 End) As [598]
,    Sum(Case When [S_92591_1].[Kontenart] = '630' Then [S_92591_1].[Saldo] Else 0 End) As [630]
From     [dbo].[S_92591] As [S_92591_1]
Where    [S_92591_1].[wBuch_jahr] = Year(GetDate())
Group By    [S_92591_1].[wBuch_Buchung_am]
Order By    [S_92591_1].[wBuch_Buchung_am]
 
anstall für jede Kontoart eine Spalte zu machen ist es einfacher, je eine Zeile da zu machen. Das ist dann auch flexibel, wenn neue Kontoarten dazukommen.
Willst Du wirklich immer eine neue Spalte, dann kommst Du besser, das dynamisch zu generieren, in einer Stored Proc. Für PG könnte ich das vorführen.
 
Nein, ich möchte nur eine neue Spalte falls es mal eine Kontenart gibt, die ich aktuelle nicht berücksichtigt habe. Mit Stored Proc habe ich noch nie gearbeitet und weiß daher nicht so genau ob wir beide von selben sprechen.

Müsste ich das dargestellte Ergebnis im übrigen dann nicht nur noch Pivotieren? Denn dann hätte ich doch auch das selbe Problem, dass ich berücksichtigen muss das evtl. eine Kontenart hinzukommt oder?
 
Also nachdem ich das hier grade von Anfang bis Ende gelesen habe fühle ich mich als wäre ich grade digital vergewaltigt worden. Du verstehst nicht ansatzweise den Unterschied zwischen einer relationalen Datenbank und einer Tabellenkalkulation.

1) Vernichte deinen bisherigen Code, am besten durch Einsatz physischer Gewalt um das ganze prägender zu gestalten.
2) Lese die Grundlagen der Normalisierung Normalisierung (Datenbank) – Wikipedia (wie man Daten in einer relationalen Datenbank aufbaut).
3) Baue dir Tabellen die du in ihrer Struktur nicht verändern musst. Trage die Daten ein.
4) Dann verarbeite diese Daten in klugen Abfragen durch Summieren, Gruppieren, etc. so das du die Werte erhälst die du in deinem Vorhaben benötigst.
5) Wenn du die Informationen für deine Übersicht anders anordnen willst hilft dir vielleicht PIVOT oder auch die Programmiersprache deiner Aplikation.
 
Das war ja ein vernichtendes Urteil. Auch wenn du recht haben magst. Ich werde mir den Beitrag auf Wikipedia einmal durchlesen und mich dann wieder melden.
 
So ich habe nun Management Studio, komme aber immer noch nicht weiter, weshalb ich eine Frage.

Wie muss der Code aussehen wenn ich so was machen möchte?
Code:
DECLARE @kopf DATE,
@intAlter Varchar (50)
Set @intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))
ALTER TABLE [S_92620] ADD @intAlter VARCHAR(100)
 
Code:
DECLARE @kopf DATE,
@intAlter Varchar (50)
Set @intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))
EXEC('ALTER TABLE [S_92620] ADD [' + @intAlter + '] VARCHAR(100)');
 
Werbung:
Bekomme dann die Fehlermeldung

"Ein Objekt- oder Spaltenname fehlt oder ist leer. Überprüfen Sie für SELECT INTO-Anweisungen, ob jede Spalte einen Namen aufweist. Suchen Sie für andere Anweisungen nach leeren Aliasnamen. Mit '' oder [] definierte Aliase sind nicht zulässig. Ändern Sie den Alias in einen gültigen Namen."

Bei einem Alter Table ist doch nur eine Spalte die da hinzugefügt werden soll. Muss ich dann noch die bereits vorhanden aufführen? Laut Hilfe nicht.

Damit ich die S_92620 ausschließen kann, habe ich sogar den ganzen Pfad eingegeben. Ohne Erfolg.

Woran liegt das also?
 
Zurück
Oben