Frage

Ich habe es stundenlang versucht, kann aber die Abfrage nicht abrufen. Ich möchte Folgendes mit DB2 tun.Aus der Tabelle „Unternehmen und Benutzer“ habe ich die folgenden Ticketmengeninformationen pro Unternehmen/Benutzer

QUERY USING:
SELECT T.USER, COUNT(T.USER) AS QUANITTY, T.COMPANY FROM TICKET T
INNER JOIN COMPANY P ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY) ORDER BY QUANTITY DESC 

Das Ergebnis ist:

user         company      quantity
----------------------------------
mark         nissn        300
tom          toyt         50
steve        kryr         80
mark         frd          20    
tom          toyt         120    
jose         toyt         230    
tom          nissn        145    
steve        toyt         10    
jose         kryr         35    
steve        frd          100

DAS SOLLTE DAS ERGEBNIS SEIN (Top-Benutzer pro Unternehmen)

user         company      quantity
----------------------------------
mark         nissn        300    
jose         toyt         230    
steve        frd          100    
steve        kryr         80

Wie Sie sehen, gibt es viele Benutzer in einem Unternehmen und alle haben unterschiedliche Mengen pro Unternehmen, das Ergebnis sollte den Benutzer mit der höchsten Menge pro Unternehmen bringen.d.h.:Unternehmen nissn Es hat 2 Benutzer und jeder hat (mit 300 markieren) und (mit 145 markieren)

Es sollte mir also den höchsten Benutzerwert geben, der mit 300 bewertet würde.Das Gleiche wäre für toyt, frd, kryr.Ich brauche sie alle in einer Abfrage.
Ich frage mich, ob das in einer Abfrage möglich ist oder ob ich eine gespeicherte Prozedur erstellen muss.

War es hilfreich?

Lösung

Sie können dies mit tun analytische Abfragen.Aber sei vorsichtig.Das Muster umfasst normalerweise verschachtelte Unterabfragen.(Einer zum Erstellen eines Datensatzes, der nächste zum Hinzufügen zum Muster, der dritte zum Auswählen der gewünschten Zeilen.)

In diesem Fall sollte es ungefähr so ​​aussehen.

Ursprüngliche Anfrage.

SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
  JOIN COMPANY P
    ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)

Analytische Abfrage.(Notiere dass der s besteht darin, die Unterabfrage zu benennen.Ich habe DB2 nicht verwendet, aber der Standard verhindert strikt nicht, dass sie gelöscht werden, und ich kenne mindestens eine Datenbank, die sie erfordert.)

SELECT user, quantity, company
  , RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM ( ... previous query ... ) s

Endergebnis.

SELECT user, quantity, company
FROM ( ... previous query ... ) t
WHERE r = 1

Die kombinierte Abfrage lautet:

SELECT user, quantity, company
FROM (
    SELECT user, quantity, company
      , RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
    FROM (
        SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
            FROM TICKET T
              JOIN COMPANY P
                ON P.COMPANY = T.COMPANY
            GROUP BY (T.USER, T.COMPANY)
      ) s
  ) t
WHERE r = 1

Wie gesagt, ich habe DB2 nicht verwendet.Laut SQL-Standard sollte diese Abfrage jedoch funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top