2011-02-08 3 views
5

У меня есть таблица базы данных Oracle, например, которая регистрирует проверяемый элемент в точке сканирования.Выберите несколько счетчиков из одной таблицы базы данных в одной команде sql

ItemsScan
ItemScanId
ItemScanPoint
ItemType
SCANTIME

Я хочу вернуть ItemScanPoint вместе с количество раз, когда определенный ItemType сканировался в этом ItemScanPoint.

Что-то вдоль линий ..

SELECT ItemScanPoint, 
     (SELECT COUNT(*) WHERE ItemType = 1), 
     (SELECT COUNT(*) WHERE ItemType = 2) 
FROM ItemsScan 

Как это сделать в оракула?

Каков наиболее эффективный способ?

ответ

13
SELECT ItemScanPoint, 
     SUM(CASE ItemType WHEN 1 THEN 1 ELSE 0 END) , 
     SUM(CASE ItemType WHEN 2 THEN 1 ELSE 0 END) 
FROM  ItemsScan 
GROUP BY ItemScanPoint 
+0

@endorphin. Это, вероятно, лучшее решение, поскольку CASE является стандартным SQL, но также FYI можно использовать функцию Oracle DECODE(), например, 'SUM (DECODE (ItemType, 1, 1, 0)), SUM (DECODE (ItemType, 2, 1, 0)) '. Можете сохранить некоторые нажатия клавиш, если вам не требуется переносное решение. –

0

Это работает для вас?

select count(ItemScanId), itemscanpoint, itemtype 
from itemsscan 
where itemtype in (1,2) 
group by itemtype, itemscanpoint 
+0

Я больше после команды SQL, у которой будет команда выбора 'select itemscanpoint, count (itemType1), count (itemType2), count (itemTypeX)'. Таким образом, имя точки сканирования элемента и все счетчики возвращаются в одной записи. – endorphin

+0

@endorphin: формы ... что? – FrustratedWithFormsDesigner

+0

Извините, не осознаю. Ввод комментариев. Я редактировал оригинал. – endorphin

0

Count - это функция группировки в оракуле. Попробуйте это:

 
select 
ItemType, 
count(ItemType) 
from 
ItemsScan 
group by 
ItemType 
+0

За исключением того, что OP также хочет «ItemScanPoint» в результирующем наборе ... – FrustratedWithFormsDesigner

0

Это можно было бы сделать это с помощью COUNT() в качестве аналитической функции, а также:

SELECT DISTINCT ItemScanPoint, ItemType 
    , COUNT(ItemScanId) OVER (PARTITION BY ItemScanPoint, ItemType) 
    FROM ItemsScan 

Он будет возвращать данные в другом формате, чем просил в OP, но он вернет результаты для все значения ItemType, а не только два.

Надеюсь, это поможет.

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