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

動的列と結合からのカウントを使用したPostgreSQLクエリ

    「試行」の簡単なクエリ

    select student_id,sum(case when assessment_id=1 then 1 else 0 end) as "Assessment 1",
    sum(case when assessment_id=2 then 1 else 0 end) as "Assessment 2",
    sum(case when assessment_id=3 then 1 else 0 end) as "Assessment 3",
    sum(case when assessment_id=4 then 1 else 0 end) as "Assessment 4",
    sum(case when assessment_id=5 then 1 else 0 end) as "Assessment 5",
    sum(case when assessment_id=6 then 1 else 0 end) as "Assessment 6"
    from assessments_students
    group by student_id
    order by student_id
    

    crosstab()関数でも、「評価1」、「評価2」などのように列名を明示的に定義する必要があります。

    または、動的クエリを作成するためのカスタム関数を記述し、EXECUTEステートメントを使用して実行します。

    DROP FUNCTION get_Attempts() ;
    
    CREATE OR REPLACE FUNCTION get_Attempts() RETURNS text AS
    $BODY$
    DECLARE
            r1 record;
            str_query text := '';
     BEGIN
        str_query :='select student_id,';
        FOR r1 IN SELECT "_id" , "name" FROM Assessments
        LOOP
          str_query:= str_query || 
                      'sum(case when assessment_id=' || r1."_id" || ' then 1 else 0 end) as  "' || r1.name ||'",' ;
        END LOOP;
        str_query:=trim( trailing  ',' from str_query); -- remove last semicolon
        str_query:= str_query || ' from assessments_students group by student_id order by student_id';
        return str_query;
    END
    $BODY$
    LANGUAGE 'plpgsql' ;
    
    SELECT * FROM get_Attempts();
    

    「合格」の2番目のクエリ

    select student_id,
    max(case when assessment_id=1 and passed='t' then 't' else 'f' end) as  "Assessment 1",
    max(case when assessment_id=2 and passed='t' then 't' else 'f' end) as  "Assessment 2",
    max(case when assessment_id=3 and passed='t' then 't' else 'f' end) as  "Assessment 3",
    max(case when assessment_id=4 and passed='t' then 't' else 'f' end) as  "Assessment 4",
    max(case when assessment_id=5 and passed='t' then 't' else 'f' end) as  "Assessment 5",
    max(case when assessment_id=6 and passed='t' then 't' else 'f' end) as  "Assessment 6" 
    from assessments_students 
    group by student_id 
    order by student_id
    

    機能は似ています

    DROP FUNCTION get_passed() ;
    
    CREATE OR REPLACE FUNCTION get_passed() RETURNS text AS
    $BODY$
    DECLARE
            r1 record;
            str_query text := '';
     BEGIN
        str_query :='select student_id,';
        FOR r1 IN SELECT "_id" , "name" FROM Assessments
        LOOP
          str_query:= str_query || 
                      'max(case when assessment_id=' || r1."_id" || ' and passed=''t'' then ''t'' else ''f'' end) as  "' || r1.name ||'",' ;
        END LOOP;
        str_query:=trim( trailing  ',' from str_query); -- remove last semicolon
        str_query:= str_query || ' from assessments_students group by student_id order by student_id';
    
        return str_query;
    END
    $BODY$
    LANGUAGE 'plpgsql' ;
    
    SELECT * FROM get_passed();
    


    1. 日時から時間をトリミングする最も効率的な方法は何ですか?

    2. mysqlからhtmlに商標記号を表示できません

    3. T-SQLを使用してSQLServerでリンクされたサーバーのリストを返す2つの方法

    4. OracleSQLテーブルへのIPアドレスの保存