COUNT с Oracle SQL - PullRequest
       7

COUNT с Oracle SQL

0 голосов
/ 12 сентября 2018

У меня есть запрос, в котором конечный пользователь хотел бы получить общее количество дозаторов в определенном месте - даже если они уже сгруппированы по местоположению и общее количество дозаторов можно увидеть, ему все еще нужен этот столбец Count.

Вот запрос, который суммирует общее количество галлонов, распределенных каждой машиной в определенном месте -

SELECT nt.COSTCENTER AS "CostCtr",
s.DAD AS "D.A.D.",
s.DIVISION AS "Division", 
nt.DISPENSER AS "Model Name",
nt.SERIALNBR AS "Serial",
nt.CLRNTSYS AS "Sys",
SUM (CASE WHEN nt.CLRNTSYS ='CCE' THEN nt.GALLONS ELSE 0 END) AS "CCE gals",
SUM (CASE WHEN nt.CLRNTSYS ='BAC' THEN nt.GALLONS ELSE 0 END) AS "BAC gals"
FROM TableNT nt 
JOIN TableSTORE s ON nt.COSTCENTER = s.COSTCENTER
WHERE nt.BOOKDATE >= '01-JAN-18' AND nt.BOOKDATE <= '31-AUG-18'
AND nt.CLRNTSYS IN ('CCE','BAC')
AND nt.TRANCODE = 'DISP'
AND nt.DISPENSER <> 'BYHAND'
GROUP BY nt.COSTCENTER, nt.DISPENSER, nt.TINTERSERIALNBR, nt.CLRNTSYS, s.DAD, s.DIVISION
ORDER BY nt.COSTCENTER, nt.DISPENSER;

В большинстве мест есть только один дозатор. У некоторых есть два, три или четыре. Если я сделаю COUNT (DISTINCT nt.DISPENSER), это будет просто возвращать «1» каждый раз, потому что каждая запись на дозатор. Есть ли способ для меня, чтобы положить общее количество дозаторов на место? то есть, если в локации есть три дозатора, запись для каждого дозатора в этом месте будет иметь «3» в столбце «Количество дозаторов»? Таким образом, если они просматривают только одну конкретную запись об одном дозаторе в определенном месте, они будут знать общее количество дозаторов, доступных в этом месте (если это имеет смысл)?

ADDENDUM - Вот пример того, что я мог бы получить для результатов, с количеством диспенсеров в каждом МВЗ в конце. Надеюсь, что это проясняет.

CostCtr|D.A.D. |Division|Model Name|Serial |Sys|CCE Gals|BAC Gals|Num Of Dsps
701003  01-06-02    01   IFC 8112NP ABCDE   CCE 37616.75 0        1
701004  02-08-25    02   IFC 7012NP 12345   BAC 0        1164.75  2 
701004  02-08-25    02   IFC 8112NP DEFGH   CCE 41843    0        2
701005  01-03-38    01   IFC 411XN  67890   CCE 24847.75 0        1
701006  01-06-02    01   IFC 411XN  IJKHL   CCE 50511.5  0        3
701006  01-06-02    01   CB 800CE   23456   BAC 20       0        3
701006  01-06-02    01   CB 2000    MNOPQ   CCE 110      0        3

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Это должно сработать - смотрите количество (*) с добавлением «over». Аналитика довольно крутая и рассчитана именно на этот тип запросов. Это предложение @ doeneth в комментариях.

SELECT nt.COSTCENTER AS "CostCtr"
    ,s.DAD AS "D.A.D."
    ,s.DIVISION AS "Division"
    ,nt.DISPENSER AS "Model Name"
    ,nt.SERIALNBR AS "Serial"
    ,nt.CLRNTSYS AS "Sys"
    ,SUM(CASE 
            WHEN nt.CLRNTSYS = 'CCE'
                THEN nt.GALLONS
            ELSE 0
            END) AS "CCE gals"
    ,SUM(CASE 
            WHEN nt.CLRNTSYS = 'BAC'
                THEN nt.GALLONS
            ELSE 0
            END) AS "BAC gals"
    ,count(*) OVER (PARTITION BY nt.COSTCENTER) AS "Num OF Dsps"
FROM TableNT nt
INNER JOIN TableSTORE s ON nt.COSTCENTER = s.COSTCENTER
WHERE nt.BOOKDATE >= '01-JAN-18'
    AND nt.BOOKDATE <= '31-AUG-18'
    AND nt.CLRNTSYS IN (
        'CCE'
        ,'BAC'
        )
    AND nt.TRANCODE = 'DISP'
    AND nt.DISPENSER <> 'BYHAND'
GROUP BY nt.COSTCENTER
    ,nt.DISPENSER
    ,nt.TINTERSERIALNBR
    ,nt.CLRNTSYS
    ,s.DAD
    ,s.DIVISION
ORDER BY nt.COSTCENTER
    ,nt.DISPENSER;
0 голосов
/ 12 сентября 2018

Где находится столбец местоположения в вашем SQL-запросе выше?

Простой запрос, который вы можете настроить:

SELECT LOCATION, COUNT(DISPENSER)
FROM YOUR TABLE
GROUP BY LOCATION
order by 1;   -- 1 means first column

Для целей тестирования создайте простой пример ниже;

CREATE TABLE "TEMP_TABLE" ("LOCATION" VARCHAR2(20), "DISPENSER_NAME" VARCHAR2(20))
REM INSERTING into TEMP_TABLE
SET DEFINE OFF;
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION1','Loc 1 - Dispenser 1');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION2','Loc 2 - Dispenser 1');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION3','Loc 3 - Dispenser 1 ');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION1','Loc 1 - Dispenser 2');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION2','Loc 2 - Dispenser 2');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION1','Loc 1 - Dispenser 3');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION2','Loc 2 - Dispenser 3');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION3','Loc 3 - Dispenser 2');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION4','Loc 4 - Dispenser 1');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION1','Loc 1 - Dispenser 4');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION5','Loc 5 - Dispenser 1');
Insert into TEMP_TABLE (LOCATION,DISPENSER_NAME) values ('LOCATION4','Loc 4 - Dispenser 2');

И затем вы можете выбрать данные в соответствии с вашими требованиями;

select location, count(dispenser_name)
from temp_table
group by location
order by 1
;

, который дает вам;

enter image description here

...