Tek sütun değerine göre SQL toplama

0

Soru

Şöyle bir masam olduğunu varsayalım.:

Kimlik 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

Bu tabloda, bazı IP adresleri bazı etki alanlarıyla ilişkilendirilir ve bunları tek URL olarak görebiliriz. (Örneğin, domain2.com, 10.100.15, 11.22.33 - bu domain2.com; 172.100.15, domain3.com - domain3.com, vb.). Benim görevim, farklı etki alanlarına sahip satırları hesaplamam ve böyle bir tablo yapmam gerektiğidir:

url sayma
alan2 4
alan 2
etki alanı3 2

Onları sadece birkaç sorgu ile sayabilirim, örneğin:

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

ve bu masayı elle yap ama hiç hoş değil.

Bunu tek bir sorguda nasıl yapabilirim?

Not: aşağıdaki yorumda belirtildiği gibi, normal toplama basit bir sorgu ile yapılabilir:

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

Ama bana sadece böyle bir masa veriyor.:

URL sayma
alan2 1
alan 2
11.22.33 2
10.100.15 1

Yoksa bir şey mi kaçırıyorum?

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

En iyi cevabı

1

Bir gruba göre gruplayabilirsiniz CASE ifade:

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;

Demoya bakın.

2021-11-14 13:52:59

Harika! Teşekkürler! Tam da ihtiyacım olan şey.
Pavel Grebenyuk
1

Daha zarif bir yol, bunu başarmak için ilişkilendirmenin veritabanında saklanmasıdır:

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

Genel olarak konuşursak, benim durumumda biraz gereksiz olsa da akıllıca bir yaklaşım. Her neyse, teşekkür ederim! Kullanışlı olabilir.
Pavel Grebenyuk
0

Group by işlevini kullanmalı ve kodunuzu şöyle yazmalısınız:

*SELECT URL, count () tablo1'den URL nerede('alan1','alan2') gruplandır (URL)

bu iş olacak!

2021-11-14 16:28:37

Hayır, öyle değil. Bu bana her URL'ye göre saymamı sağlıyor. BİR etki alanına atanan bazı satırları birleştirmem gerekiyor.
Pavel Grebenyuk

Diğer dillerde

Bu sayfa diğer dillerde

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