Announcement

Collapse
No announcement yet.

Berechnete Spalte dem Datatable hinzufügen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Berechnete Spalte dem Datatable hinzufügen

    Hallo,

    ich müßte ein datatable um eine berechnete Splate erweitern, damit ich diese mit im DataGridView anzegen kann.

    Hier die Umgebung

    Tabelle TAB enthält Monat, UmsatzActJahr, UmsatzVorjahr

    Im Grid benötige ich folgende Spalten:

    Monat,
    Umsatz,
    kum Umsatz akt Jahr
    kum Umsatz Vorjahr
    entwicklung in %

    Meine SQL-Anweisung, mit der ich schon alles bekomme,außer die prozentuale Enwicklung und ich bekomme die irgendwie nicht in das SQL-Statment mit rein.

    Von daher dachte ich an, wenn ich die Berechnung als neue Spalte dem Datatable hinzufügen könnte, wäre es auch gelöst...

    SQL-Statment
    Select Monat, UmsatzActJahr,
    (select sum(umsatzActJahr) from Tab b where b.Monat <= a.monat) as KumAJ,
    (select sum(umsatzVorJahr) from Tab b where b.Monat <= a.monat) as KumVJ
    from TAB a

    Jetzt bräuchte ich noch KUMAJ/KUMVJ, wobei hier die Division / 0 abgefangen werden müßte.



    Hat jemand eine Idee, wie ich das am besten umsetzen kann.


    Viele Grüße
    Christina

  • #2
    Hallo Christina,

    die Division kannst Du doch auch in das SELECT aufnehmen. Wie "durch Null" verhindert werden kann, hängt vom DBMS ab. Je nach SQL-Dialekt heißt das CASE, WHEN o.ä.

    Gruß Jürgen

    Comment


    • #3
      Hallo Jürgen,

      meinst Du so? Ich verwende übrigends SQL2005

      Code:
      Select Monat, UmsatzActJahr, 
      (select sum(umsatzActJahr) from Tab b where b.Monat <= a.monat) as KumAJ, 
      (select sum(umsatzVorJahr) from Tab b where b.Monat <= a.monat) as KumVJ , 
      case 
      when (select sum(umsatzActJahr) from Tab b where b.Monat <= a.monat) 
      then(select sum(umsatzActJahr) from Tab b where b.Monat <= a.monat) / (select sum(umsatzActJahr) from Tab b where b.Monat <= a.monat) as entwickling
      else 0
      end
      from TAB a
      Das heißt ich führe die Unterabfragen 2 - 3 mal aus. Das kann doch nicht gut für die Laufzeit sein.

      Da ich öfters auf soclhe Probleme stoße, würde mich halt wirklich interessieren, ob ich in VB.NET zu einem bestehenden Datatable das aus einer Abfrage kommt, Spalten hinzufügen kann, die ich dann ggf. aus den Spalten berechnen kann.

      Viele Grüße
      Karline

      Comment


      • #4
        Hallo,

        zum einen glaube ich, dass die DB die Abfrage selbst optimiert, sodass die Unterabfrage nicht häufiger ausgeführt werden muss als nötig. Dann kannst du das selbst verknüpfen:
        Code:
        Select a.Monat, a.UmsatzActJahr, 
           sum(b.umsatzActJahr) as KumAJ, 
           sum(b.umsatzVorJahr) as KumVJ
        from TableA a
        join TableB b ON b.Monat <= a.monat
        Ob JOIN auch mit "kleiner/gleich" umgehen kann, weiß ich nicht, aber ich halte es für denkbar. Außerdem musst du natürlich deine Tabellenstruktur berücksichtigen. Meistens ist JOIN besser als die Verknüpfung zweier Tabellen durch WHERE oder Subselect.

        Für die CASE-Ergänzung sollte der temp-Spaltenname direkt verwendet werden können:
        Code:
           ( case 
              when (KumAJ <> 0) 
                 then KumAJ / KumVJ
              else 0
           end ) as  entwickling
        Achtung: Ich habe keine Kenntnisse über MS-SQL, deshalb ist diese Antwort nur als Hinweis zu verstehen. Einzelheiten musst du selbst heraussuchen.

        Berechnete Spalten in einer DataTable hinzuzufügen ist durchaus möglich, siehe SDK-Doku/MSDN unter DataColumn Ausdrucksspalte. Einzelheiten, wie das gehen kann, stehen unter DataColumn.Expression. Auch die Prüfung auf "ungleich null" ist mit IIF möglich.

        Ich hätte auf dieses Verfahren gleich bei meiner ersten Antwort hinweisen können. Aber wenn die Daten in dieser Form per SELECT aus der DB kommen, dürfte die CASE-WHEN-Konstruktion besser sein.

        Gruß Jürgen

        Comment

        Working...
        X