代码之家  ›  专栏  ›  技术社区  ›  Across Liuran

Oracle SQL-删除别名结果中的空行

  •  1
  • Across Liuran  · 技术社区  · 2 年前

    各位开发人员,我正在开发一个使用oracle sql的小型公益项目,但我无法隐藏空结果。

    表结构:

    CREATE TABLE "church-members" (
    ID NUMBER(10),
    NAME varchar(30)  NOT NULL,
    LOGIN varchar(20)  NOT NULL,
    PASS  varchar(12)  NOT NULL,
    REGISTER_YEAR_MONTH varchar(15)  NOT NULL,
    USER_SCORE NUMBER(10),
    PRIMARY KEY (ID));
    

    查询:

    INSERT INTO "church-members" VALUES
    ('1', 'John Doe', 'John', 'Xo8*d_d%f58*', '202204','1');
    
    INSERT INTO "church-members" VALUES
    ('2', 'Mary Doe', 'Mary', 'dLoc&257dsew', '202203','2');
    
    INSERT INTO "church-members" VALUES
    ('3', 'Robertson III', 'Robertson', 'koIIf59*Liu*', '202203','7');
    
    INSERT INTO "church-members" VALUES
    ('4', 'Sonia MacDonald', 'Sonia', 'fYhfgtdjfi%', '202204','4');
    
    INSERT INTO "church-members" VALUES
    ('5', 'Boris Johnston', 'Boris', 'do*&flddkIK%', '202201','2');
    
    INSERT INTO "church-members" VALUES
    ('6', 'Ruth Henderson', 'Ruth', 'dF6%*&', '202202','2');
    

    选择:

    SELECT 
        ID,
        NAME,
        LOGIN,
        MAX(CASE WHEN REGISTER_YEAR_MONTH = '202203' THEN TO_CHAR(USER_SCORE) ELSE '' END) AS "MARCH SCORE",
        MAX(CASE WHEN REGISTER_YEAR_MONTH = '202204' THEN TO_CHAR(USER_SCORE) ELSE '' END) AS "APRIL SCORE "
    FROM 
        "church-members" 
    
    GROUP BY 
        ID,
        NAME,
        LOGIN
    

    其结果是:

    https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=a4deac5e3eefb17dca97661552458a61

    我是通过从这个链接的答案中获得的信息得出这一点的: Select more than one column and remove NULL values from result

    看看fiddle示例,不应该显示ID为5和6的结果,因为它们都是空值。 但仍然显示空结果。。。

    有人能帮我解决吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Tim Biegeleisen    2 年前

    添加一个 HAVING 条款要求每个匹配ID至少有两个月中的一个月的数据:

    SELECT ID, NAME, LOGIN,
           MAX(CASE WHEN REGISTER_YEAR_MONTH = '202203' THEN TO_CHAR(USER_SCORE) END) AS "MARCH SCORE",
           MAX(CASE WHEN REGISTER_YEAR_MONTH = '202204' THEN TO_CHAR(USER_SCORE) END) AS "APRIL SCORE"
    FROM "church-members"
    GROUP BY ID, NAME, LOGIN
    HAVING COUNT(CASE WHEN REGISTER_YEAR_MONTH IN ('202203', '202204') THEN 1 END) > 0;