2016-01-11 3 views
5

голубчик Stackoverflowers,PostgreSQL: Как выбрать 2 различных отсчеты из таблицы при х = а и х = Ь

Как может один выбрать 2 разных счетчиков из той же таблицы для сценариев:

x=a and x=b 

в частности, (WHEN type = subdomain) AND (КОГДА подтип = поддомен)?

, чтобы добавить их вместе, чтобы создать «totalcount»?

Моя попытка (для справки):

SELECT description, type, count(1), subtype, count(2) 
FROM mapping, (dotcom WHERE type = subdomain) AS typecount, 
    (dotcom WHERE subtype = subdomain) AS subtypecount 
GROUP BY description, type, subtype 
HAVING count(1)>1 
AND count(2)>1 
ORDER BY count(*) 
DESC LIMIT 10 

Вторая попытка:

SELECT description 
FROM mapping, SUM(WHEN subdomain = type OR subdomain = subtype) AS count(1) 
GROUP BY description, type, subtype 
HAVING count(1)>1 
ORDER BY count(*) 
DESC LIMIT 10 
+1

Может быть с некоторым 'SUM (WHEN type = subdomain THEN 1 ELSE 0 END)' –

+0

Мне нужен SUM для увеличения, когда type и subtype = subdomain, поэтому возможно SUM (КОГДА тип ИЛИ подтип = поддомен THEN 1 ELSE 0 END;) <- возможно ли это? – user5527252

+0

Вы также можете попробовать использовать Count (особый тип), Count (отдельный подтип) –

ответ

0

Если я понял ваше требование правильно, Вы можете сделать как ниже

SELECT description, SUM(CASE WHEN subdomain = type OR subdomain = subtype THEN 1 ELSE 0 END) 
FROM mapping 
GROUP BY description 
0

использования

SELECT 
     SUM(
      CASE WHEN type = 'whatever' 
       THEN column_name_1 
       ELSE coumn_name_2 
      END AS column1, 
      CASE WHEN subtype = 'whatever2' 
      THEN column_name_3 
      ELSE coumn_name_4 
      END AS column2 
    ) 
0

Если у вас есть Postgres 9.4 или новее, вы можете использовать FILTER, что намного легче читать, чем синтаксис CASE WHEN ... END.

SELECT 
    description, 
    type, 
    COUNT(*) FILTER (WHERE subdomain = type) AS typecount, 
    subtype, 
    COUNT(*) FILTER (WHERE subtype = subdomain) AS subtypecount 
FROM mapping 
GROUP BY description, type, subtype; 

Следует отметить, что count(1) и count(2) не делать то, что вы, вероятно, думаете, что делает; count - это совокупная функция, которая рассчитывает, если заданное значение не является нулевым в каждой строке, и, видя, что вы даете ему целочисленный литерал, он будет эффективно подсчитывать только количество возвращаемых строк.