Announcement

Collapse
No announcement yet.

Zusätzliche Spalte nur in der View (oder SELECT?) erzeugen

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

  • Zusätzliche Spalte nur in der View (oder SELECT?) erzeugen

    Hi,
    heute stehe ich vor folgendem Problem:

    Es exisiteren drei Datenbanken, die u.a. eine Tabelle enthalten, die in jeder der Datenbanken den gleichen Namen trägt.
    Bevor ich mich hier aber "textuell" in dunkle Gefilde bewege, hier lieber eine tabellarische Übersicht.

    Code:
    SQL-Server 2008 (MS SQL)
    
    DB : Germany                DB : United_Kingdom         DB : United_States
    TAB: Exportgueter           TAB: Exportgueter           TAB: Exportgueter
    +--+-----------+------+     +--+-----------+------+     +--+-----------+------+
    |ID|Bezeichnung|Stueck|     |ID|Bezeichnung|Stueck|     |ID|Bezeichnung|Stueck|
    +--+-----------+------+     +--+-----------+------+     +--+-----------+------+
    | 1|Tastatur   |  3000|     | 1|Tastatur   |  2000|     | 1|Tastatur   |  5000|
    +--+-----------+------+     +--+-----------+------+     +--+-----------+------+
    | 2|Malblock   | 10000|     | 2|Malblock   |  6000|     | 2|Malblock   |  8000|
    +--+-----------+------+     +--+-----------+------+     +--+-----------+------+
    | 3|Maus       |  4000|     | 3|Maus       | 10000|     | 3|Maus       | 15000|
    +--+-----------+------+     +--+-----------+------+     +--+-----------+------+
    Es exitieren also die drei Datenbanken 'Germany', 'United_Kingdom' und 'United_States'.
    Jede Datenbank enthält u.a. die Tabelle 'Exportgueter'.
    Der Name dieser Tabelle ist in jeder der DBs gleich.

    Jetzt möchte ich wissen, wie viel Artikel exportiert wurden.
    Aber nicht nur bezogen auf ein Land, sondern auf alle drei Länder.
    Ich benötige also eine Abfrage, die mir über die drei Datenbanken geht.

    Meine erste Idee waren SELECT-Anweisungen mit UNION:

    [highlight=sql]
    SELECT [Bezeichnung],[Stueck] FROM [Germany].[dbo].[exportgueter]
    UNION
    SELECT [Bezeichnung],[Stueck] FROM [United_Kingdom].[dbo].[exportgueter]
    UNION
    SELECT [Bezeichnung],[Stueck] FROM [United_States].[dbo].[exportgueter]
    [/highlight]

    Als Ergebnis erhalte ich:

    Code:
    +-----------+------+
    |Bezeichnung|Stueck|
    +-----------+------+
    |Malblock   |  6000|
    +-----------+------+
    |Malblock   |  8000|
    +-----------+------+
    |Malblock   | 10000|
    +-----------+------+
    |Maus       |  4000|
    +-----------+------+
    |Maus       | 10000|
    +-----------+------+
    |Maus       | 15000|
    +-----------+------+
    |Tastatur   |  2000|
    +-----------+------+
    |Tastatur   |  3000|
    +-----------+------+
    |Tastatur   |  5000|
    +-----------+------+
    Inhaltlich sieht das doch schon gut aus.

    ABER...es fehlt natürlich noch eine Spalte, die mir Auskunft über das Land gibt.
    Da das Land nicht in einer Tabelle gesichert ist, kann ich auf keine entsprechene
    Spalte zugreifen. Ich müsste den Namen der jeweiligen Datenbank ermitteln und
    in einer zusätzlichen Spalte darstellen.

    Nur wie ?
    Die Ermittlung des Datenbanknamens ist soweit klar.
    (z. B. mit EXEC sp_databases...es gibt ja noch andere Möglichkeiten)
    Aber wie stelle ich das dann in einer zusätzlichen Spalte dar?
    Mit CREATE VIEW oder JOINs oder einer anderen Form der SELECT-Anweisung?

    Die Ausgabe könnte dann z.B. wie folgt aussehen:
    Code:
    +-----------+------+--------------+
    |Bezeichnung|Stueck|Land          |
    +-----------+------+--------------+
    |Malblock   |  6000|United_Kingdom|
    +-----------+------+--------------+
    |Malblock   |  8000|United_States |
    +-----------+------+--------------+
    |Malblock   | 10000|Germany       |
    +-----------+------+--------------+
    |Maus       |  4000|Germany       |
    +-----------+------+--------------+
    |Maus       | 10000|United_Kingdom|
    +-----------+------+--------------+
    |Maus       | 15000|United_States |
    +-----------+------+--------------+
    |Tastatur   |  2000|United_Kingdom|
    +-----------+------+--------------+
    |Tastatur   |  3000|Germany       |
    +-----------+------+--------------+
    |Tastatur   |  5000|United_States |
    +-----------+------+--------------+
    ...und um es noch ein bissel weiter zu treiben...der Ferrari unter den Abfragen, würde mir folgende Tabelle ausgeben:
    Code:
    +--------+-------+--------------+-------------+
    |        |Germany|United_Kingdom|United_States|
    +--------+-------+--------------+-------------+
    |Malblock|  10000|          6000|8000         |
    +--------+-------+--------------+-------------+
    |Maus    |   4000|         10000|15000        |
    +--------+-------+--------------+-------------+
    |Tastatur|   3000|          2000|5000         |
    +--------+-------+--------------+-------------+
    Da scheint dann aber schon extrem tricky zu sein. ,-)

    Danke
    Dickus
    Zuletzt editiert von Dickus; 12.07.2012, 09:30. Reason: SQL highlight

  • #2
    Originally posted by Dickus View Post

    Die Ausgabe könnte dann z.B. wie folgt aussehen:
    Code:
    +-----------+------+--------------+
    |Bezeichnung|Stueck|Land          |
    +-----------+------+--------------+
    |Malblock   |  6000|United_Kingdom|
    +-----------+------+--------------+
    |Malblock   |  8000|United_States |
    +-----------+------+--------------+
    Das wäre relativ einfach mit einer virtuellen Spalte zu erledigen:
    [highlight=sql]
    SELECT [Bezeichnung],[Stueck], 'Germany' as Land FROM [Germany].[dbo].[exportgueter]
    UNION
    SELECT [Bezeichnung],[Stueck], 'United_Kingdom' as Land FROM [United_Kingdom].[dbo].[exportgueter]
    UNION
    SELECT [Bezeichnung],[Stueck], 'United_States' as Land FROM [United_States].[dbo].[exportgueter]
    [/highlight]

    Warum der DB Name abgefragt werden muss, ist mir allerdings unklar. Du bestimmst ihn ja sowieso im Select selbst.

    Der Rest ist dann nur noch ein Pivot auf dieses Ergebnis oben.
    Gruß, defo

    Comment


    • #3
      Stimmt, an die virtuelle Spalte habe ich nicht mehr gedacht.

      Das Land hätte ich schon gerne in der "Ausgabe"-Tabelle, damit
      klar ist, wo der Wert hingehört.

      Mir ist da aber schon eine neue Idee gekommen...;-)

      Dickus

      Comment


      • #4
        Originally posted by Dickus View Post
        Stimmt, an die virtuelle Spalte habe ich nicht mehr gedacht.

        Das Land hätte ich schon gerne in der "Ausgabe"-Tabelle, damit
        klar ist, wo der Wert hingehört.

        Mir ist da aber schon eine neue Idee gekommen...;-)

        Dickus
        Du könntest mit 'select db_name()' arbeiten. Ich weiß aber nicht, wie das aufgelöst wird. Kann es hier auch nicht ausprobieren. Im Zweifel muss es also in einen View 'VEXPORTGUETER' auf den lokalen Tabellen.
        Wenn das zu umständlich ist, muss man sich den entsprechenden Wert aus einer lokalen Dictionary Table holen, statt per Funktion (die liefert sicher nur den Wert der aktiven Session)
        Gruß, defo

        Comment


        • #5
          So...da bin ich wieder

          Ich habe eine Abfrage geschrieben, die mir foglende Tabellensicht auswirft:

          Code:
          +-----------+-------+--------------+-------------+
          |Bezeichnung|Germany|United_Kingdom|United_States|
          +-----------+-------+--------------+-------------+
          |Tastatur   |   3000|          2000|         5000|
          +-----------+-------+--------------+-------------+
          |Malblock   |  10000|          6000|         8000|
          +-----------+-------+--------------+-------------+
          |Maus       |   4000|         10000|        15000|
          +-----------+-------+--------------+-------------+
          Allerdings habe ich dafür folgendes Monster an Abfrage aus meinen Gehirnwindungen gekramt:

          [highlight=sql]
          IF object_id('dbo.view3', 'V') IS NOT NULL
          DROP VIEW dbo.view3
          GO

          CREATE VIEW view3 AS
          SELECT
          t1.[Bezeichnung] AS Bezeichnung,
          t2.[Stueck] AS Germany,
          t3.[Stueck] AS United_Kingdom,
          t4.[Stueck] AS United_States
          FROM
          [Germany].[dbo].[exportgueter] t1,
          [Germany].[dbo].[exportgueter] t2,
          [United_Kingdom].[dbo].[exportgueter] t3,
          [United_States].[dbo].[exportgueter] t4
          WHERE t1.[Bezeichnung] = 'Malblock'
          AND t1.[ID]=t2.[ID]
          AND t2.[ID]=t3.[ID]
          AND t3.[ID]=t4.[ID]
          OR t1.[Bezeichnung] = 'Maus'
          AND t1.[ID]=t2.[ID]
          AND t2.[ID]=t3.[ID]
          AND t3.[ID]=t4.[ID]
          OR t1.[Bezeichnung] = 'Tastatur'
          AND t1.[ID]=t2.[ID]
          AND t2.[ID]=t3.[ID]
          AND t3.[ID]=t4.[ID]
          GO

          SELECT Bezeichnung, Germany, United_Kingdom, United_States
          FROM view3
          GO
          [/highlight]

          lol...das geht sicherlich auch anders...

          Dickus

          Comment

          Working...
          X