SQL agregación de valor de una sola columna

0

Pregunta

Supongamos que tengo una tabla como esta:

Id url
1 11.22.33
2 11.22.33
3 domain.com
4 domain2.com
5 domain.com
6 10.100.15
7 domain3.com
8 172.100.15
9 172.100.15

En esta tabla, algunos de direcciones IP están asociados con algunos de los dominios y los podemos considerar de ser única dirección URL. (Por ejemplo, domain2.com, 10.100.15, 11.22.33 - es domain2.com; 172.100.15, domain3.com - domain3.com, etc). Mi tarea es que tengo que calcular filas con diferentes dominios y hacer una tabla como esta:

url contar
domain2 4
dominio 2
domain3 2

Yo sólo podía contar con varias consultas, tales como:

SELECT COUNT(*) 
FROM table1
WHERE (table1.url = “10.100.15”
    OR table1.url = “11.22.33” OR table1.url = “domain2.com”)

y hacer esta tabla de forma manual, pero no es genial.

¿Cómo podría hacer en una sola consulta?

PS: como se mencionó en el comentario de abajo, habitual de agregación se podría hacer con una simple consulta:

SELECT url, count(*) 
FROM table1
WHERE GROUP BY url

Pero me da que sólo la tabla como esta:

URL contar
domain2 1
dominio 2
11.22.33 2
10.100.15 1

O me estoy perdiendo algo?

case count group-by sql
2021-11-14 12:20:36
3

Mejor respuesta

1

Puede agrupar por un CASE expresión:

SELECT CASE 
         WHEN URL IN ('10.100.15', '11.22.33', 'domain2.com') THEN 'domain2.com'
         WHEN URL IN ('172.100.15', 'domain3.com') THEN 'domain3.com'
         ELSE URL
       END domain,
       COUNT(*) count
FROM tablename
GROUP BY domain;

Ver la demo.

2021-11-14 13:52:59

Genial! Gracias! Justo lo que necesito.
Pavel Grebenyuk
1

Una forma más elegante es tener la asociación almacenados en la base de datos para lograr que:

WITH
-- your input ...
indata(Id,url) AS (
          SELECT 1,'11.22.33'
UNION ALL SELECT 2,'11.22.33'
UNION ALL SELECT 3,'domain.com'
UNION ALL SELECT 4,'domain2.com'
UNION ALL SELECT 5,'domain.com'
UNION ALL SELECT 6,'10.100.15'
UNION ALL SELECT 7,'domain3.com'
UNION ALL SELECT 8,'172.100.15'
UNION ALL SELECT 9,'172.100.15'
)
,
-- need an association table - which "url" belongs to which domain
assoc(dom,url) AS (
            SELECT 'domain2.com','10.100.15'
  UNION ALL SELECT 'domain2.com','11.22.33'
  UNION ALL SELECT 'domain3.com','172.100.15'
)
SELECT
  CASE 
    WHEN a.dom IS NULL THEN i.url
    ELSE a.dom
  END AS domain
, COUNT(*) AS counter
FROM indata AS i
LEFT
JOIN assoc  AS a USING(url)
GROUP BY domain
;

-- out
-- out    domain    | counter
-- out -------------+---------
-- out  domain2.com |       4                                                                                                                                                                             
-- out  domain3.com |       3
-- out  domain.com  |       2
-- out (3 rows)
2021-11-14 13:46:49

Generalmente hablando, es un acercamiento inteligente, aunque un poco redundante en mi caso. De todos modos, gracias! Puede ser útil.
Pavel Grebenyuk
0

Usted debe utilizar el grupo por función y escribir un código como este:

SELECCIONE URL, count(*) from tabla1 donde URL('dominio1','domain2') grupo (URL)

funcionará!

2021-11-14 16:28:37

No, no lo es. Esto me da contando por cada URL. Tengo que combinar algunas filas que asignar a UN dominio.
Pavel Grebenyuk

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................