Pregunta

He estado intentando durante horas pero no puedo GE la consulta, quiero hacer lo siguiente con DB2. De la compañía de tabla y los usuarios tengo la siguiente información de la cantidad de boletos por empresa/usuario

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 

El resultado es:

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

Este debería ser el resultado (el mejor usuario por empresa)

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

Como puede ver, hay muchos usuarios en una empresa y cada uno tiene diferentes cantidades por empresa, el resultado debe obtener al usuario con la mayor cantidad por empresa. es decir: empresa nissn Tiene 2 usuarios y cada uno tiene (marca con 300) y (Tom con 145)

Por lo tanto, debería darme el usuario más alto que sería Mark con 300. Lo mismo sería para toyt, frd, kryr. Los necesito todos en una consulta.
Me pregunto si eso es posible en una consulta o si necesitaré crear un procedimiento almacenado.

¿Fue útil?

Solución

Puedes hacer esto con consultas analíticas. Pero ten cuidado. El patrón generalmente funciona para involucrar subconsules anidados. (Uno para producir un conjunto de datos, el siguiente para agregarlo al patrón, el tercero para seleccionar las filas que desea).

En este caso debería verse algo así.

Consulta original.

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)

Consulta analítica. (Tenga en cuenta que el s es nombrar la subconsulta. No he usado DB2, pero el estándar estrictamente no impide que se eliminen, y conozco al menos una base de datos que los requiere).

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

Resultado final.

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

La consulta combinada es:

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

Como digo, no he usado DB2. Pero según el estándar SQL, esa consulta debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top