CREATE OR REPLACE FUNCTION public."FamilyOnPeriod" ( "DateBegin" date, "DateEnd" date ) RETURNS TABLE ( "Id" integer, "FamilyId" integer, "Age" integer, "Sex" integer, "IsChild" integer, "IsParent" integer, x01 integer, -- это человек семьи (для просчета количества людей в семье) x02 integer, -- это ребенок до 14 лет x03 integer, -- это ребенок до 18 лет x04 integer, -- это родитель, для подсчета родителей x05 integer, -- это молодая семья x06 integer, -- это вдова или вдовец x07 integer, -- это женщина-мать, родившая вне брака x08 integer, -- это несовершеннолетняя одинокая мать x09 integer, -- это одинокая мать, получающая пособие x10 integer, -- это разведенный родитель x11 integer, -- это семья усыновителей + родитель x12 integer, -- это гражданин пожилого возраста x13 integer, -- это одиноко-проживающий гражданин пожилого возраста x14 integer, -- это инвалид I-II группы x15 integer, -- это одиноко-проживающий инвалид I-II группы x16 integer, -- это выпускник-родитель x17 integer, -- это пенсионер x19 integer, -- несовершеннолетний родитель x20 integer, -- несовершеннолетний родитель из числа детей-сирот x21 integer, -- родитель-инвалид I-II группы x23 integer, -- ребенок в социально-опасном положении x24 integer, -- ребенок-инвалид с детства x25 integer, -- ребенок из числа детей сирот x26 integer, -- ребенок выпускник интернат x27 integer, -- ребенок c болезнями x29 integer, -- из семьи беженцев x30 integer, -- из семьи опекунов x31 integer, -- из семьи приемной x32 integer, -- из семьи отселенной x33 integer -- из семьи, получающей пособие ) AS ' SELECT x."Id"::INTEGER, x."FamilyId"::INTEGER, x."Age"::INTEGER, x."Gender"::INTEGER, x."IsChild"::INTEGER, x."IsParent"::INTEGER, -- это человек семьи (для просчета количества людей в семье) 1::INTEGER AS "X01", -- это ребенок до 14 лет CASE WHEN x."IsChild">0 AND x."Age"<14 THEN 1::INTEGER ELSE 0::INTEGER END AS "X02", -- это ребенок до 18 лет CASE WHEN x."IsChild">0 THEN 1::INTEGER ELSE 0::INTEGER END AS "X03", -- это родитель, для подсчета родителей CASE WHEN x."IsParent">0 THEN 1::INTEGER ELSE 0::INTEGER END AS "X04", -- это молодая семья CASE WHEN x."R10">0 THEN 1::INTEGER ELSE 0::INTEGER END AS "X05", -- это вдова или вдовец CASE WHEN x."R01" = 694 THEN 1::INTEGER ELSE 0::INTEGER END AS "X06", -- это женщина-мать, родившая вне брака CASE WHEN (x."R01" NOT IN (692,693,694)) AND (x."Gender">0) AND (x."IsParent">0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X07", -- это несовершеннолетняя одинокая мать CASE WHEN (x."R01" NOT IN (692,697)) AND (x."Gender">0) AND (x."IsParent">0) AND (x."Age"<18) THEN 1::INTEGER ELSE 0::INTEGER END AS "X08", -- это одинокая мать, получающая пособие CASE WHEN (x."R01" NOT IN (692,697)) AND (x."Gender">0) AND (x."IsParent">0) AND (x."R11">0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X09", -- это разведенный родитель CASE WHEN (x."R01" = 693) AND (x."IsParent">0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X10", -- это семья усыновителей + родитель CASE WHEN (x."R12" > 0) AND (x."IsParent">0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X11", -- это гражданин пожилого возраста CASE WHEN (x."Age" > 60) THEN 1::INTEGER ELSE 0::INTEGER END AS "X12", -- это одиноко-проживающий гражданин пожилого возраста CASE WHEN (x."Age" > 60) AND (x."R03" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X13", -- это инвалид I-II группы CASE WHEN (x."R02" IN (863,864)) THEN 1::INTEGER ELSE 0::INTEGER END AS "X14", -- это одиноко-проживающий инвалид I-II группы CASE WHEN (x."R02" IN (863,864)) AND (x."R03" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X15", -- это выпускник-родитель CASE WHEN (x."IsParent" > 0) AND (x."R04" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X16", -- это пенсионер CASE WHEN (x."R05" > 0) OR (x."R08" = 858) THEN 1::INTEGER ELSE 0::INTEGER END AS "X17", -- несовершеннолетний родитель CASE WHEN (x."IsParent" > 0) AND (x."Age" < 18) THEN 1::INTEGER ELSE 0::INTEGER END AS "X19", -- несовершеннолетний родитель из числа детей-сирот CASE WHEN (x."IsParent" > 0) AND (x."Age" < 18) AND (x."R09" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X20", -- родитель-инвалид I-II группы CASE WHEN (x."IsParent" > 0) AND (x."R02" IN (863,864)) THEN 1::INTEGER ELSE 0::INTEGER END AS "X21", -- ребенок в социально-опасном положении CASE WHEN (x."IsChild" > 0) AND (x."R06" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X23", -- ребенок-инвалид с детства CASE WHEN (x."IsChild" > 0) AND (x."R02" = 1235) THEN 1::INTEGER ELSE 0::INTEGER END AS "X24", -- ребенок из числа детей сирот CASE WHEN (x."IsChild" > 0) AND (x."R09" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X25", -- ребенок выпускник интернат CASE WHEN (x."IsChild" > 0) AND (x."R04" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X26", -- ребенок c болезнями CASE WHEN (x."IsChild" > 0) AND (x."R07" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X27", -- из семьи беженцев CASE WHEN (x."R14" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X29", -- из семьи опекунов CASE WHEN (x."R13" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X30", -- из семьи приемной CASE WHEN (x."R15" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X31", -- из семьи отселенной CASE WHEN (x."R16" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X32", -- из семьи, получающей пособие CASE WHEN (x."R11" > 0) THEN 1::INTEGER ELSE 0::INTEGER END AS "X33" FROM ( SELECT x.*, COALESCE(pr01."Rubrica",0) AS "R01", -- Семейное положение COALESCE(pr02."Rubrica",0) AS "R02", -- Инвалидность COALESCE(pr03."Rubrica",0) AS "R03", -- Одинокое проживание COALESCE(pr04."Rubrica",0) AS "R04", -- Выпускник интернатных учреждений COALESCE(pr05."Rubrica",0) AS "R05", -- Пенсионер COALESCE(pr06."Rubrica",0) AS "R06", -- Социально опасное положение COALESCE(pr07."Rubrica",0) AS "R07", -- Наличие заболеваний COALESCE(pr08."Rubrica",0) AS "R08", -- Социальный статус COALESCE(pr09."Rubrica",0) AS "R09", -- Из числа детей-сирот COALESCE(pr10."Rubrica",0) AS "R10", -- Молодая семья COALESCE(pr11."Rubrica",0) AS "R11", -- Получение пособий COALESCE(pr12."Rubrica",0) AS "R12", -- Семья усыновителей COALESCE(pr13."Rubrica",0) AS "R13", -- Опекунская семья COALESCE(pr14."Rubrica",0) AS "R14", -- Семья беженцев COALESCE(pr15."Rubrica",0) AS "R15", -- Приемная семья COALESCE(pr16."Rubrica",0) AS "R16" -- Отселенная семья FROM ( SELECT x."Id", x."Age", CASE WHEN x."Gender" THEN 1::INTEGER ELSE 0::INTEGER END AS "Gender", x."FamilyId", CASE WHEN SUM(CASE WHEN COALESCE(x."Childs1",0)>0 THEN 1 ELSE 0 END) = 0 AND SUM(CASE WHEN COALESCE(fa2."Relation",0)>0 THEN 1 ELSE 0 END) = 0 AND x."Age" < 18 THEN 1::INTEGER ELSE 0::INTEGER END AS "IsChild", CASE WHEN SUM(CASE WHEN COALESCE(x."Childs1",0)>0 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN COALESCE(fa2."Relation",0)>0 THEN 1 ELSE 0 END) = 0 THEN 1::INTEGER ELSE 0::INTEGER END AS "IsParent" FROM ( SELECT c."Id", CASE WHEN c."YearOfBirth" < 150 THEN c."YearOfBirth" ELSE (EXTRACT(year FROM now()) - c."YearOfBirth") END AS "Age", c."Gender", c."FamilyId", CASE WHEN ((COALESCE(fa1."Relation",0)>0) AND (fa1."ClientOne" = c."Id")) THEN fa1."ClientTwo" WHEN ((COALESCE(fa1."Relation",0)>0) AND (fa1."ClientTwo" = c."Id")) THEN fa1."ClientOne" ELSE 0 END AS "Childs1" FROM "Clients" AS c LEFT JOIN "Family" AS fa1 ON (fa1."ClientOne" = c."Id" AND fa1."Relation" IN (15,16,19,20)) OR (fa1."ClientTwo" = c."Id" AND fa1."Relation" IN (10,21,22,30)) WHERE c."FamilyId" IN ( SELECT c."FamilyId" FROM "Service" AS s, "Service2Clients" AS sc, "Clients" AS c WHERE c."Id" = sc."Client" AND sc."Service" = s."Id" AND s."Date" BETWEEN $1 AND $2 AND s."State" > 0 AND sc."Present" ) ) AS x LEFT JOIN "Family" AS fa2 ON (fa2."ClientOne" = x."Childs1" AND fa2."Relation" IN (15,16,19,20)) OR (fa2."ClientTwo" = x."Childs1" AND fa2."Relation" IN (10,21,22,30)) GROUP BY x."Id", x."Age", x."Gender", x."FamilyId" ) AS x LEFT JOIN "Points2Rubrica" AS pr01 ON pr01."Point" = x."Id" AND pr01."System" & 2 = 2 AND pr01."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 111) LEFT JOIN "Points2Rubrica" AS pr02 ON pr02."Point" = x."Id" AND pr02."System" & 2 = 2 AND pr02."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 100) LEFT JOIN "Points2Rubrica" AS pr03 ON pr03."Point" = x."Id" AND pr03."System" & 2 = 2 AND pr03."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 104) LEFT JOIN "Points2Rubrica" AS pr04 ON pr04."Point" = x."Id" AND pr04."System" & 2 = 2 AND pr04."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 156) LEFT JOIN "Points2Rubrica" AS pr05 ON pr05."Point" = x."Id" AND pr05."System" & 2 = 2 AND pr05."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 106) LEFT JOIN "Points2Rubrica" AS pr06 ON pr06."Point" = x."Id" AND pr06."System" & 2 = 2 AND pr06."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 130) LEFT JOIN "Points2Rubrica" AS pr07 ON pr07."Point" = x."Id" AND pr07."System" & 2 = 2 AND pr07."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 153) LEFT JOIN "Points2Rubrica" AS pr08 ON pr08."Point" = x."Id" AND pr08."System" & 2 = 2 AND pr08."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 114) LEFT JOIN "Points2Rubrica" AS pr09 ON pr09."Point" = x."Id" AND pr09."System" & 2 = 2 AND pr09."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 112) LEFT JOIN "Points2Rubrica" AS pr10 ON pr10."Point" = x."FamilyId" AND pr10."System" & 4 = 4 AND pr10."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 125) LEFT JOIN "Points2Rubrica" AS pr11 ON pr11."Point" = x."FamilyId" AND pr11."System" & 4 = 4 AND pr11."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 128) LEFT JOIN "Points2Rubrica" AS pr12 ON pr12."Point" = x."FamilyId" AND pr12."System" & 4 = 4 AND pr12."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 155) LEFT JOIN "Points2Rubrica" AS pr13 ON pr13."Point" = x."FamilyId" AND pr13."System" & 4 = 4 AND pr13."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 126) LEFT JOIN "Points2Rubrica" AS pr14 ON pr14."Point" = x."FamilyId" AND pr14."System" & 4 = 4 AND pr14."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 154) LEFT JOIN "Points2Rubrica" AS pr15 ON pr15."Point" = x."FamilyId" AND pr15."System" & 4 = 4 AND pr15."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 152) LEFT JOIN "Points2Rubrica" AS pr16 ON pr16."Point" = x."FamilyId" AND pr16."System" & 4 = 4 AND pr16."Rubrica" IN (SELECT r."Id" FROM "Rubricator" AS r WHERE r."GroupId" = 127) ) AS x' LANGUAGE 'sql' IMMUTABLE STRICT SECURITY INVOKER COST 100 ROWS 1000000;