Files
genome2025/backend/check-data.js

96 lines
3.6 KiB
JavaScript

const { Client } = require('pg');
async function main() {
const conn = new Client({
host: 'localhost',
port: 5432,
user: 'postgres',
password: 'turbo123',
database: 'genome_db'
});
await conn.connect();
// 1. 해당 개체의 형질 데이터 확인
const cowTraitsResult = await conn.query(
"SELECT trait_name, trait_ebv FROM tb_genome_trait_detail WHERE cow_id = 'KOR002191643715' AND del_dt IS NULL ORDER BY trait_name"
);
const cowTraits = cowTraitsResult.rows;
console.log('=== 개체 KOR002191643715 형질 데이터 ===');
console.log('형질수:', cowTraits.length);
let totalEbv = 0;
cowTraits.forEach(t => {
console.log(t.trait_name + ': ' + t.trait_ebv);
totalEbv += Number(t.trait_ebv || 0);
});
console.log('\n*** 내 개체 EBV 합계(선발지수):', totalEbv.toFixed(2));
// 2. 해당 개체의 농가 확인
const cowInfoResult = await conn.query(
"SELECT gr.fk_farm_no, f.farmer_name FROM tb_genome_request gr JOIN tb_cow c ON gr.fk_cow_no = c.pk_cow_no LEFT JOIN tb_farm f ON gr.fk_farm_no = f.pk_farm_no WHERE c.cow_id = 'KOR002191643715' AND gr.del_dt IS NULL LIMIT 1"
);
const cowInfo = cowInfoResult.rows;
console.log('\n=== 농가 정보 ===');
console.log('농가번호:', cowInfo[0]?.fk_farm_no, '농장주:', cowInfo[0]?.farmer_name);
const farmNo = cowInfo[0]?.fk_farm_no;
// 3. 같은 농가의 모든 개체 EBV 합계
if (farmNo) {
const farmCowsResult = await conn.query(
`SELECT c.cow_id, SUM(gtd.trait_ebv) as total_ebv, COUNT(*) as trait_count
FROM tb_genome_request gr
JOIN tb_cow c ON gr.fk_cow_no = c.pk_cow_no
JOIN tb_genome_trait_detail gtd ON gtd.cow_id = c.cow_id AND gtd.del_dt IS NULL
WHERE gr.fk_farm_no = $1 AND gr.del_dt IS NULL AND c.del_dt IS NULL
AND gr.chip_sire_name = '일치'
GROUP BY c.cow_id
HAVING COUNT(*) = 35
ORDER BY total_ebv DESC`,
[farmNo]
);
const farmCows = farmCowsResult.rows;
console.log('\n=== 같은 농가 개체들 EBV 합계 (35형질 전체) ===');
console.log('개체수:', farmCows.length);
let farmSum = 0;
farmCows.forEach(c => {
console.log(c.cow_id + ': ' + Number(c.total_ebv).toFixed(2));
farmSum += Number(c.total_ebv);
});
if (farmCows.length > 0) {
console.log('\n*** 농가 평균:', (farmSum / farmCows.length).toFixed(2));
}
}
// 4. 전체 보은군 평균
const allCowsResult = await conn.query(
`SELECT c.cow_id, SUM(gtd.trait_ebv) as total_ebv
FROM tb_genome_request gr
JOIN tb_cow c ON gr.fk_cow_no = c.pk_cow_no
JOIN tb_genome_trait_detail gtd ON gtd.cow_id = c.cow_id AND gtd.del_dt IS NULL
WHERE gr.del_dt IS NULL AND c.del_dt IS NULL
AND gr.chip_sire_name = '일치'
GROUP BY c.cow_id
HAVING COUNT(*) = 35`
);
const allCows = allCowsResult.rows;
console.log('\n=== 보은군 전체 통계 ===');
console.log('개체수:', allCows.length);
let regionSum = 0;
allCows.forEach(c => regionSum += Number(c.total_ebv));
if (allCows.length > 0) {
console.log('*** 보은군 평균:', (regionSum / allCows.length).toFixed(2));
}
// 5. 최대/최소 확인
if (allCows.length > 0) {
const maxCow = allCows.reduce((max, c) => Number(c.total_ebv) > Number(max.total_ebv) ? c : max, allCows[0]);
const minCow = allCows.reduce((min, c) => Number(c.total_ebv) < Number(min.total_ebv) ? c : min, allCows[0]);
console.log('\n최대:', maxCow?.cow_id, Number(maxCow?.total_ebv).toFixed(2));
console.log('최소:', minCow?.cow_id, Number(minCow?.total_ebv).toFixed(2));
}
await conn.end();
}
main().catch(console.error);