使用Oracle SQL计数

大红EO

我有一个查询,最终用户希望某个位置的分配器总数-尽管已经按位置将分配器分组并且可以看到分配器的总数,但他们仍然想要该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”?这样,如果他们只查看某个位置的一个分配器的一个特定记录,他们会知道该位置可用的分配器总数(如果有意义)?

附录-以下是我可能希望取得的结果的一个示例,最后是每个成本中心的点胶机数量。希望这可以澄清。

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
丹达克

这应该可以工作-看到count(*)加上“ over”。Google Analytics(分析)非常酷,仅针对此类查询而设计。这是@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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章