我想聚合 Oracle SQL 中特定月份的所有值

问题描述 投票:0回答:1

我想创建一个从现有表中获取值的表。 现有表具有以下列:

NAME VARCHAR2(255 BYTE) , 
TYPE VARCHAR2(255 BYTE) , 
DT_CHECKPOINT VARCHAR2(255 BYTE),  
STATUS VARCHAR2(255 BYTE) 

我有这样的行:

record 1: U83   PC/BC   21/10/2023  OK
record 2: U83   PC/BC   22/10/2023  KO
record 3: FR    DH      22-OTT-23   KO
record 4: FR    DH      25-OTT-23   KO

我想创建一个新表来计算当月的 KO 值和 OK 值,如下所示:

record 1: U83      PC/BC    OTT-23  1  1
record 2: FR        DH      OTT-23  0  2

如何创建这个表?我知道 DT_CHECKPOINT 是 VARCHAR2 是不正确的,但我无法更改它

sql oracle plsql oracle-sqldeveloper
1个回答
0
投票

尚不清楚两行中部分日期字符串均为“OTT-23”背后的逻辑是什么。因此,排除您可以使用条件聚合并按前两列进行分组:

WITH    --  S a m p l e   D a t a :
    tbl ( A_NAME, A_TYPE, DT_CHECKPOINT, STATUS ) AS
        ( Select 'U83', 'PC/BC', '21/10/2023', 'OK' From Dual Union All
          Select 'U83', 'PC/BC', '22/10/2023', 'KO' From Dual Union All
          Select 'FR',  'DH',    '22-OTT-23',  'KO' From Dual Union All
          Select 'FR',  'DH',    '25-OTT-23',  'KO' From Dual 
        )
--  M a i n    S Q L :
Select  A_NAME, A_TYPE,         
        Count(Case When STATUS = 'KO' Then 1 End) "KO_COUNT",
        Count(Case When STATUS = 'OK' Then 1 End) "OK_COUNT"
From    tbl
Group By A_NAME, A_TYPE
Order By A_NAME Desc
/*    R e s u l t :
A_NAME A_TYPE   KO_COUNT   OK_COUNT
------ ------ ---------- ----------
U83    PC/BC           1          1
FR     DH              2          0   */

如果你解释为什么日期部分应该像问的那样,也许有人可以帮忙。

© www.soinside.com 2019 - 2024. All rights reserved.