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

ブール列のSQLAlchemyfunc.count

    HAVINGで集計関数を使用する HAVINGなので、句は非常に合法です グループ行を削除します。条件付きカウントは、NULLというプロパティを使用して実行できます。 sカウントしない:

    count(expression) ...式の値がnullでない入力行の数

    または、PostgreSQL 9.4以降を使用している場合は、集約FILTER 条項:

    count(*) FILTER (WHERE something > 0)
    

    1(および0)の合計を使用することもできます。

    PostgreSQL>=9.4およびSQLAlchemy>=1.0.0

    フィルター処理された集計関数の使用:

    .having(func.count(1).filter(Question.accepted) >
            func.count(1).filter(not_(Question.accepted)))
    

    古いPostgreSQLおよび/またはSQLAlchemy

    「if」のSQLアナログは、CASEのいずれかです。 式またはこの場合はnullif() 働き。どちらもNULLという事実と一緒に使用できます sカウントしない:

    from sqlalchemy import case
    
    ...
    
    .having(func.count(case([(Question.accepted, 1)])) >
            func.count(case([(not_(Question.accepted), 1)])))
    

    または:

    .having(func.count(func.nullif(Question.accepted, False)) >
            func.count(func.nullif(Question.accepted, True)))
    

    nullif()を使用する 「条件」はあなたがしないものであるため、少し混乱する可能性があります 数えたい。条件をより自然にする式を考案することもできますが、それは読者に任されています。これら2つはより移植性の高いソリューションですが、一方でFILTER 条項は標準ですが、広く利用できるわけではありません。



    1. MySQLはデータベースのユーザーに特権を付与します

    2. T-SQLで年ごとにグループ化する方法

    3. OracleSQLDeveloperでtnsnames.oraを使用する

    4. Transact-SQLでの連結