2015-11-02 7 views
0

в моей школе мы учимся с разработчиком sql sql. моя задача проста. мне нужно подсчитать, сколько одинаковых значений в одном столбце, например:sql - запрос вместо группы по

COLA COLB COLC .... 
    A  ...  ...  .... 
    A  ...  ...  .... 
    A  ...  ...  .... 
    B  ...  ...  .... 
    B  ...  ...  .... 
    C  ...  ...  .... 
    C  ...  ...  .... 
    D  ...  ...  .... 

так мне нужна информация о: сколько элементов а, сколько B и на.

Важно то, что я не могу использовать группу. Единственное, что я могу использовать это:

select, from, where, union, intersect, minus, distinct, count, and, or, as, between.

не может понять, что к настоящему времени, любая помощь?

+2

Непонятно, чего вы пытаетесь достичь. Можете ли вы заполнить таблицу выше, а также показать нам свой ожидаемый результат? –

+0

остальная часть таблицы является релевантной, все, что мне нужно, это информация о том, сколько равных vales у меня в той же колонке. –

ответ

1

Итак, ваш вопрос заключается в том, как достичь GROUP BY без использования GROUP BY.

SELECT t.*, (SELECT COUNT(*) FROM tbl WHERE COLA = t.COLA) FROM (
    SELECT DISTINCT COLA FROM tbl 
) AS t 
+0

Хорошая идея. Но: 'AS t' приведет к ошибке в Oracle - ключевое слово' AS' не поддерживается для псевдонимов таблицы –

+0

Таблица, которую я дал, является только примером, моя таблица построена из идентификаторов. поэтому его неизвестный набор переменных. Я не могу использовать соединение и суб-запрос. –

1

Решение проблемы с использованием UNION. Предполагается, что у вас есть только буквы A по D.

SELECT COUNT(COLA) AS theCount, 'A' as theType 
From table 
WHERE COLA = 'A' 
UNION ALL 
SELECT COUNT(COLA) AS theCount, 'B' as theType 
From table 
WHERE COLA = 'B' 
UNION ALL 
SELECT COUNT(COLA) AS theCount, 'C' as theType 
From table 
WHERE COLA = 'C' 
UNION ALL 
SELECT COUNT(COLA) AS theCount, 'D' as theType 
From table 
WHERE COLA = 'D' 

Это даст вам таблицу вывода ищет что-то вроде этого:

╔══════════╦═════════╗ 
║ theCount ║ theType ║ 
╠══════════╬═════════╣ 
║  3 ║ A ║ 
╠══════════╬═════════╣ 
║  2 ║ B ║ 
╠══════════╬═════════╣ 
║  2 ║ C ║ 
╠══════════╬═════════╣ 
║  1 ║ D ║ 
╚══════════╩═════════╝ 

Отказ от ответственности: Это решение хорошо, если у вас есть только несколько типов значений столбцов. Если у вас есть либо неизвестный набор значений, либо большое количество известных значений, это не путь.

+0

Вы должны переместить 'A 'в качестве типа в предложении select. –

+0

Союзы не будут подавлять любые строки, потому что А отличается от B, C и т. Д. Итак, почему вы не ставите 'union all'? Это вводит в заблуждение ... –

1

Я думаю, что вы ищете для поиска дубликатов подсчитывать

SELECT 
    colA, count(colA) 
FROM myTable a 
JOIN myTable b 
ON a.colA = b.colA 
AND a.ROWID > b.ROWID 
+0

Мне нравится этот ответ, но он, похоже, не перечисляет 'JOIN' как допустимое ключевое слово. –

+1

@TimBiegeleisen: явный 'JOIN' может быть заменен старомодным неявным условием соединения в предложении' where' –

+0

@horse Хорошая точка, я об этом не думал. –

1

Итак, вам просто нужно рассчитывать значения без использования пункта group by ...

select distinct cola, cnt 
from( 
    select cola, count(*) over (partition by cola) as cnt 
    from table 
    ) 

Это отсчета над разделом по вещь analytic function syntax

Смежные вопросы