Jump to content

hh2000

Board Veteran
  • Content Count

    550
  • Joined

  • Last visited

Community Reputation

10 Neutral

About hh2000

  • Rank
    Board Veteran
  1. Moin, wenn du eine Variable in einem SELECT zuweist (> SELECT @Variable = Zelle FROM inserted) war die Frage was passiert, wenn im Statement mehrere Zeilen als Ergebnis vorkommen. Die Variable speichert ja nur einen Wert, die Anzahl der Datensätze in inserted ist aber größer 1. Genauso kann es passieren, dass dein Insert-Statement kein Datensatz einfügt, weil die Bedingung nicht erfüllt ist. Der Trigger wird dann aber trotzdem ausgelöst: INSERT INTO Tabelle (...) SELECT ... FROM NochneTabelle WHERE 1=2 Trigger wird gestartet, dein o.g. "SELECT @Variable = Zelle FROM inserted" ergibt dann @Variable = NULL Bei SQL immer mengenbasiert denken, nicht zeilenweile (ok, da gibt es auch Möglichkeiten), daher der Einwand was passiert beim Einfügen von keinem , einem oder mehreren Datensätzen. Gruß Kai
  2. Moin, ist das ein "Instead of" oder "After" Trigger? Biite immer bedenken, das beim Einfügen kein, ein oder mehrere Datensätze möglich sind. Das muss der Trigger verarbeiten können. Unbedingt den Trigger auf diese Fälle prüfen. > SELECT @Variable = Zelle FROM inserted Was passiert mit @Variable, wenn du mehr als einen Datensatz verarbeitest? Schöner ware etwas wie: IF EXISTS ( SELECT * FROM inserted Where ....) BEGIN ... Tut hier was END Du kannst zum prüfen auch inserted mit anderen Tabellen JOINen, um dann weitere Aktionen durchzuführen. > beim eingefügten Datensatz sind einige Zellen mit NULL Hast Du evtl. noch andere Befehle im Trigger die die Tabelle inserted manipulieren ? Ob der xp_cmdshell hier evtl. noch andere Nebenwirkungen bei bestimmten Bedingungen hat, weiß ich leider nicht. Gruß Kai
  3. Das sieht von der Struktur her schonmal gut aus. Nur als Tipp: - Betrachte jedes SELECT Statement für sich und bewerte das Ergebenis - kontrolliere nochmal den JOIN (evtl. Copy-Paste Fehler) - kommen die Daten aus der jeweils richtigen Spalte - kontrolliere den WHERE String, oben hast du noch von 'EVARFFOLIENNUMMER%' gesprochen, der taucht hier aber nicht mehr auf. Gruß Kai
  4. Moin, z.B. eine zweite Abfrage (mit anderem JOIN) mit gleichem Spaltenlayout machen und beide Abfragen dann mit UNION (siehe Onlinehilfe) verknüpfen. ​ ​Gruß Kai
  5. einfach ein OR KEYIPAR1 like 'EVARFFOLIENNUMMER%' anhängen (OR, AND, siehe Onlinehilfe): join tbl_par on tbl_par.parlfd2 = tbl_vbs.VBSFOLET where KEYIPAR1 like 'EVARFFOLIENETIKET%' OR KEYIPAR1 like 'EVARFFOLIENNUMMER%' Sollte allerdings 'EVARFFOLIENNUMMER%' eine feste Zeichenkette sein, so solltest Du statt "like" lieber "=" benutzen ("like" funktioniert hier aber auch). Gruß Kai
  6. Moin, als Anregung, die Abfrage SELECT TOP 1 ArtikelNr, Preis FROM T_Tabelle ORDER BY Datum DESC WHERE Artikel = 4711 ergibt den gesuchten aktuellen Preis für _einen_ Artikel. Das kann man z.B. in eine korrelierende Unterabfrage einbauen: SELECT ArtikelNr, ( SELECT TOP 1 Preis FROM T_Tabelle B ORDER BY Datum DESC WHERE B.ArtikelNr = A.ArtikelNr ) AS AktuellerPreis FROM T_Tabelle A Evtl. noch GROUP BY je nach Bedarf Gruß Kai
  7. Moin, anderer Vorschlag: -- andere Datentypen DECLARE @Jahr SMALLINT DECLARE @Monat TINYINT SET @Jahr = 2014 SET @Monat = 12 CAST('01.' + STR(@Monat) + '.' + STR(@Jahr) AS DATETIME) Gruß Kai
  8. Moin, das wären m.E. die verschiedenen Ansätze zu Deinen Fragen: -- Kunden die gar nicht in Tabelle 2 (T2) enthalten sind: SELECT Tabelle1.* FROM Tabelle1 WHERE Tabelle1.Kunde NOT IN ( SELECT Kunde FROM Tabelle2 ) -- Kunden die keine Artikel in Tabelle 2 (T2) haben: SELECT Tabelle1.* FROM Tabelle1 WHERE Tabelle1.Artikel NOT IN ( SELECT Artikel FROM Tabelle2 WHERE Tabelle1.Kunde = Tabelle2.Kunde ) -- Kunden die sowohl in T1 als auch in T2 Artikel die gleichen Artikel haben SELECT Tabelle1.* FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.Kunde = Tabelle2.Kunde AND Tabelle1.Artikel = Tabelle2.Artikel ggf. doppelte Datensätze / Sortierung sind nicht berücksichtigt. Gruß Kai
  9. Moin, hat Deine Tabelle einen eindeutigen Schlüssel oder eine Spalte von Typ timestamp ? Gruß Kai
  10. Moin, ohne auf das Subselect einzugehen, müsste ein weiteres GROUP BY ausreichen: SELECT System_Typ, count(*) as System_Zugriffe_Monat_NB FROM( SELECT SUBSTRING([Ev_Station],1,2) as System_Typ FROM [TEST].[dbo].[EVENTHISTORY] WHERE CAST(substring(CONVERT(varchar(10),[Ev_Time],101),1,2) as numeric) = @paraMonat and cast(substring(CONVERT(varchar(10),[Ev_Time],101),7,4) as numeric) = @paraJahr and Ev_User !='Unbestimmter Benutzer' and Ev_User != 'Guest' --and SUBSTRING([Ev_Station],1,2)='NB' group by [Ev_User],[Ev_Station],SUBSTRING([Ev_Station],1,2) ) z GROUP BY System_Typ Gruß Kai PS: Funktionieren mit der Spalte "Ev_Time" keine Datumsfunktionen?
  11. Moin, ich würde unter SQL immer versuchen _keine_ While-Schleifen oder sehr viele Subselects einzusetzen. Zerlege das Problem in kleine Schritte und schau dir jeweils die Zwischenergebnisse an: - Annahme: die Zählerstande sind aufsteigend, das Feld Datum enthält das Datum zum Messwert. 1 .View mit den Monatszählerständen (hier nur ein Zähler): SELECT YEAR([Datum]) as Jahr, MONTH([Datum]) as Monat, MAX([Zaehler_1K1_1]) AS AktuellerMonat FROM [SKEMS-HST-POWER].[dbo].[EnergieMonat] AS AktMonat GROUP BY YEAR([Datum]), MONTH([Datum]) 2. "Hilfs"-View mit den Vormonatswerten in der aktuellen Monatszeile. Das DATEADD dient nur dazu, die Monat- / Jahresspalten anders darzustellen (Monat + 1): SELECT YEAR(DATEADD(mm, 1, [Datum]) as Jahr, MONTH(DATEADD(mm, 1, [Datum]) as Monat, MAX([Zaehler_1K1_1]) FROM [SKEMS-HST-POWER].[dbo].[EnergieMonat] AS VorMonat GROUP BY YEAR(DATEADD(mm, 1, [Datum]), MONTH(DATEADD(mm, 1, [Datum]) 3. Hinzufügen zweier Hilfsspalten: SELECT YEAR([Datum]) as Jahr, MONTH([Datum]) as Monat, MAX([Zaehler_1K1_1]) AS AktuellerMonat, 0 AS Vormonat FROM [SKEMS-HST-POWER].[dbo].[EnergieMonat] AS AktMonat GROUP BY YEAR([Datum]), MONTH([Datum]) SELECT YEAR(DATEADD(mm, 1, [Datum]) as Jahr, MONTH(DATEADD(mm, 1, [Datum]) as Monat, 0, MAX([Zaehler_1K1_1]) FROM [SKEMS-HST-POWER].[dbo].[EnergieMonat] AS VorMonat GROUP BY YEAR(DATEADD(mm, 1, [Datum]), MONTH(DATEADD(mm, 1, [Datum]) Beide Tabelle haben nun das gleiche Format: Jahr, Monat, AktuellerMonat, Vormonat Mittels UNION ALL beide Views zusammenfügen und per erneutem GROUP BY gruppieren. So würde dann der fertige View aussehen: SELECT Jahr, Monat, SUM(AktuellerMonat), SUM(Vormonat), SUM(AktuellerMonat) - SUM(Vormonat) AS Differenz FROM ( SELECT YEAR([Datum]) as Jahr, MONTH([Datum]) as Monat, MAX([Zaehler_1K1_1]) AS AktuellerMonat, 0 AS Vormonat FROM [SKEMS-HST-POWER].[dbo].[EnergieMonat] AS AktMonat GROUP BY YEAR([Datum]), MONTH([Datum]) UNION ALL SELECT YEAR(DATEADD(mm, 1, [Datum]) as Jahr, MONTH(DATEADD(mm, 1, [Datum]) as Monat, 0, MAX([Zaehler_1K1_1]) FROM [SKEMS-HST-POWER].[dbo].[EnergieMonat] AS VorMonat GROUP BY YEAR(DATEADD(mm, 1, [Datum]), MONTH(DATEADD(mm, 1, [Datum]) ) a GROUP BY Jahr, Monat Für weitere Zähler die Zeilen "MAX([Zaehler_1K1_1]) AS AktuellerMonat, 0 AS Vormonat" und"0, MAX([Zaehler_1K1_1])" kopieren und die Aliasnamen anpassen. Gruß Kai
  12. Moin, Cursor sollten nur für Probleme genutzt werden, die nicht mit "normalen" SQL gelöst werden können (mengenbasiert <> zeilenorientiert). Korrekte Rechte auf den verschiedenen Datenbanken vorausgesetzt, könnte das so aussehen (Vollqualifizierter Bezeichner): SELECT * FROM DB1.dbo.stammdaten UNION ALL SELECT * FROM DB2.dbo.stammdaten UNION ALL SELECT * FROM DB3.dbo.stammdaten ... siehe auch SQL-Onlinehilfe "Bezeichner" Gruß Kai
  13. Moin, mit einem Sub-SELECT funktioniert es: SELECT ID FROM Tabelle WHERE Zwischendatensatz IN ( SELECT Zwischendatensatz FROM Tabelle WHERE Enddatensatz = 66 ) Das ist jedoch nur ein Teil-Ergebnis der Gesamtlösung, genaugenommen nur die Antwort auf Deine letzte Frage. Gruß Kai
  14. Moin, das könnte so aussehen: SELECT tab_alles.fil as Filiale tab_alles.name as Sachbearbeiter COUNT (tab_alles.name) as Anzahl_pro_Sachbearbeiter SUM (tab_alles.pos) as Positionen_pro_Sachbearbeiter DATEPART (Month, tab_alles.datum) as Monat FROM ( SELECT tab1.fil, tab1.name, tab1.pos, tab1.datum WHERE tab1.datum BETWEEN ('01-01-2013') AND ('31-12-2013') UNION ALL SELECT tab2.fil, tab2.name, tab2.pos, tab2.datum WHERE tab2.datum BETWEEN ('01-01-2013') AND ('31-12-2013') ) tab_alles GROUP BY DATEPART(Month,tab_alles.datum), tab_alles.fil, tab_alles.name Gruß Kai
  15. Moin, wie schon gesagt, mit einem Sub-SELECT funktioniert es: SELECT * FROM Tabelle WHERE Auftrag IN ( SELECT Auftrag FROM Tabelle WHERE Position IS NULL ) Gruß Kai
×
×
  • Create New...