sql >> データベース >  >> RDS >> Oracle

Oracle SQL Group By if

    SQLフィドル

    Oracle11gR2スキーマのセットアップ

    CREATE TABLE FILE_USAGE_LOG (TESTID, SITE, LATEST_READ, READ_COUNT, FILE_ORIGIN_ID ) AS
              SELECT 'File1', 'Site1', DATE '2013-05-02', 2, 1 FROM DUAL
    UNION ALL SELECT 'File1', 'Site2', DATE '2014-01-22', 3, 2 FROM DUAL
    UNION ALL SELECT 'File2', 'Site1', DATE '2014-06-02', 8, 0 FROM DUAL
    UNION ALL SELECT 'File3', 'Site1', DATE '2014-09-19', 17, 0 FROM DUAL
    UNION ALL SELECT 'File4', 'Site2', DATE '2014-09-19', 14, 2 FROM DUAL
    UNION ALL SELECT 'File4', 'Site2', DATE '2014-09-19', 34, 1 FROM DUAL
    UNION ALL SELECT 'File4', 'Site3', DATE '2014-09-19', 10, 0 FROM DUAL
    UNION ALL SELECT 'File5', 'Site2', DATE '2014-09-19', 44, 2 FROM DUAL
    UNION ALL SELECT 'File5', 'Site3', DATE '2014-09-19', 1, 2 FROM DUAL;
    

    クエリ1

    SELECT  TESTID,
            REGEXP_REPLACE( 
              LISTAGG( SITE, ', ' )
                WITHIN GROUP( ORDER BY SITE ),
              '([^, ]+)(, \1)+($|, )',
              '\1\3'
            ) AS SITES, 
            MAX( LATEST_READ ) AS LATEST_READ,
            SUM(READ_COUNT) AS Total_Read_Count
    FROM    FILE_USAGE_LOG 
    GROUP BY
            TESTID
    HAVING  COUNT( CASE FILE_ORIGIN_ID WHEN 2 THEN NULL ELSE 1 END ) > 0
    UNION ALL
    SELECT  TESTID,
            SITE,
            LATEST_READ,
            READ_COUNT
    FROM    FILE_USAGE_LOG l
    WHERE   FILE_ORIGIN_ID = 2
    AND     NOT EXISTS ( SELECT 'X'
                         FROM   FILE_USAGE_LOG x
                         WHERE  x.TESTID      = l.TESTID
                         AND    x.FILE_ORIGIN_ID <> 2
                       )
    ORDER BY 1,2
    

    結果

    | TESTID |        SITES |                 LATEST_READ | TOTAL_READ_COUNT |
    |--------|--------------|-----------------------------|------------------|
    |  File1 | Site1, Site2 |   January, 22 2014 00:00:00 |                5 |
    |  File2 |        Site1 |      June, 02 2014 00:00:00 |                8 |
    |  File3 |        Site1 | September, 19 2014 00:00:00 |               17 |
    |  File4 | Site2, Site3 | September, 19 2014 00:00:00 |               58 |
    |  File5 |        Site2 | September, 19 2014 00:00:00 |               44 |
    |  File5 |        Site3 | September, 19 2014 00:00:00 |                1 |
    

    クエリ2

    SELECT  TESTID,
            REGEXP_REPLACE( 
              LISTAGG( SITE, ', ' )
                WITHIN GROUP( ORDER BY SITE ),
              '([^, ]+)(, \1)+($|, )',
              '\1\3'
            ) AS SITES, 
            MAX( LATEST_READ ) AS LATEST_READ,
            SUM(READ_COUNT) AS Total_Read_Count
    FROM    FILE_USAGE_LOG 
    WHERE   TESTID NOT LIKE 'this%'
    AND     LATEST_READ BETWEEN DATE '2014-01-01' AND DATE '2014-12-31'
    GROUP BY
            TESTID
    HAVING  COUNT( CASE FILE_ORIGIN_ID WHEN 2 THEN NULL ELSE 1 END ) > 0
    UNION ALL
    SELECT  TESTID,
            SITE,
            LATEST_READ,
            READ_COUNT
    FROM    FILE_USAGE_LOG l
    WHERE   FILE_ORIGIN_ID = 2
    AND     NOT EXISTS ( SELECT 'X'
                         FROM   FILE_USAGE_LOG x
                         WHERE  x.TESTID      = l.TESTID
                         AND    x.FILE_ORIGIN_ID <> 2
                         AND    TESTID NOT LIKE 'this%'
                         AND    LATEST_READ BETWEEN DATE '2014-01-01' AND DATE '2014-12-31'
                       )
    AND     TESTID NOT LIKE 'this%'
    AND     LATEST_READ BETWEEN DATE '2014-01-01' AND DATE '2014-12-31'
    ORDER BY 1,2
    

    結果

    | TESTID |        SITES |                 LATEST_READ | TOTAL_READ_COUNT |
    |--------|--------------|-----------------------------|------------------|
    |  File1 |        Site2 |   January, 22 2014 00:00:00 |                3 |
    |  File2 |        Site1 |      June, 02 2014 00:00:00 |                8 |
    |  File3 |        Site1 | September, 19 2014 00:00:00 |               17 |
    |  File4 | Site2, Site3 | September, 19 2014 00:00:00 |               58 |
    |  File5 |        Site2 | September, 19 2014 00:00:00 |               44 |
    |  File5 |        Site3 | September, 19 2014 00:00:00 |                1 |
    


    1. インデックスはMySQLの比較よりも高速になりますか?

    2. SQLでの出現に番号を付ける方法

    3. AndroidでListViewを使用してSQLiteデータベースを読み取って更新する方法は?

    4. PostgreSQLエラー:EXECUTEのクエリ文字列引数がnullです