대전참여자치시민연대
데이터 플랫폼
SQL 활용 가이드
← 대시보드로 돌아가기
목차
Datasette 사용법 SQL 기초 문법 수집 중인 테이블 목록
조회 예시
나라장터 계약 감시civic 의안·법안 추적civic 재정·결산 분석integrated 입법예고 모니터링elis 조회 팁 & 패턴
SQL 활용 가이드

데이터를 직접 꺼내 쓰는 법

SQL은 데이터베이스에 질문하는 언어입니다. 영어 문장처럼 읽히도록 설계되어 있어서, 규칙 몇 가지만 알면 복잡한 조건으로도 데이터를 뽑아낼 수 있습니다. 아래 예시를 복붙해서 바로 사용하세요.

🖥️

Datasette SQL 창 여는 법

사이드바 "직접 조회 (SQL)"를 클릭하면 Datasette 기본 화면으로 이동합니다. 아래 순서로 SQL 입력창을 엽니다.

1
DB 선택
사이드바에서 DB를 클릭합니다. 계약·의안 → 시민감시 DB(civic), 정리된 결산 → 계약·결산(integrated), 입법예고 → 입법예고(elis).
2
SQL 버튼 클릭
DB 페이지 상단 오른쪽 ▶ SQL 쿼리 실행 버튼을 클릭합니다.
3
SQL 붙여넣기 후 실행
아래 예시 오른쪽 복사 버튼 → 텍스트 창 붙여넣기 → ▶ 실행 클릭. 새 탭으로 바로 열고 싶다면 바로 실행 버튼을 사용하세요.
4
결과 내보내기
결과 표 아래 CSV 버튼 → 엑셀에서 바로 열 수 있는 파일로 저장됩니다.
팁: 검색 조건을 바꿀 때는 WHERE 다음의 값만 수정하면 됩니다. 예) '대전광역시' → '세종특별자치시'
📘

SQL 기초 문법

"어떤 정보를 / 어느 테이블에서 / 어떤 조건으로 / 어떻게 정렬해서 / 몇 개나"라는 순서로 읽으면 됩니다.

SELECT
어떤 컬럼을 볼지
SELECT * → 전체 / SELECT 이름, 금액 → 일부
FROM
어느 테이블에서
FROM contracts → contracts 테이블
WHERE
조건 필터링
WHERE region = '대전광역시'
LIKE
부분 일치 검색
LIKE '%청솔%' → "청솔"이 포함된 값
ORDER BY
정렬 기준
ORDER BY contract_amount DESC → 금액 큰 순
LIMIT
결과 개수 제한
LIMIT 50 → 최대 50개만 표시
GROUP BY
묶어서 집계
GROUP BY org → 기관별로 묶기
COUNT / SUM
건수 세기 / 합계
COUNT(*) 건수, SUM(amount) 합계
AND vs OR: 조건 두 개를 모두 만족 → AND. 둘 중 하나만 → OR. 예) 대전 AND 수의계약 / 대전 OR 세종
📋

수집 중인 테이블 목록

FROM 다음에 쓰는 테이블 이름입니다.

테이블명DB내용 및 주요 컬럼
contracts
civic
나라장터 계약 (2018~현재)
region, org, vendor, contract_name, contract_amount, contract_date, bid_method
bills
civic
국회·지방의회 의안·법안
bill_type, bill_name, region, org, proposer, propose_date, committee, result
meetings
civic
지방의회 회의록
region, org, meeting_date, agenda, speaker, content
people
civic
의원 정보 (국회·지방 925명)
name, region, org, party, district, position, gender
law_master
civic
전국 자치법규 (조례·규칙)
law_name, region, org, law_type, promulgate_date
announcements
civic
나라장터 입찰공고
org, title, bid_method, budget_amount, deadline_date
contract
integrated
계약 정리본 (85,892건) — 부서·분류 정제됨
gov_code, dept_norm, dept_category, fiscal_year, contract_name, method, vendor, amount
settlement
integrated
지방재정 결산 (158,759건, 2002~2024)
gov_code, fiscal_year, category_name, amount
subsidy
integrated
지방 보조금 집행 (16,634건)
gov_code, fiscal_year, category_name, amount
notices
elis
ELIS 입법예고 (자동 수집)
title, ministry, field, start_date, end_date, url, outcome
gov_code 주요 값 (integrated DB):
3000000 대전광역시 · 3011000 동구 · 3012000 중구 · 3013000 서구 · 3014000 유성구 · 3015000 대덕구 · EDU-DJ 대전교육청
📑

나라장터 계약 감시

DB: civic · 테이블: contracts · bid_method 값: '수의계약' '제한경쟁' '일반경쟁' '지명경쟁'

대전시 수의계약 1억 원 이상 목록
계약금액 큰 순으로 정렬. 금액은 원 단위.
SELECT org, vendor, contract_name, contract_amount, contract_date, bid_method
FROM contracts
WHERE region = '대전광역시'
  AND bid_method = '수의계약'
  AND contract_amount >= 100000000
ORDER BY contract_amount DESC
LIMIT 50;
특정 업체의 계약 내역 전체 검색
업체명 일부만 알아도 됩니다. % 는 "아무 문자나 가능" 의미.
SELECT org, contract_name, contract_amount, contract_date, bid_method
FROM contracts
WHERE vendor LIKE '%업체명%'     -- '업체명' 자리에 찾고 싶은 이름을 넣으세요
ORDER BY contract_date DESC;
기관별 수의계약 총액 순위
어느 기관이 수의계약을 가장 많이 맺었는지 파악.
SELECT org,
       COUNT(*) AS 계약건수,
       SUM(contract_amount) AS 총계약액
FROM contracts
WHERE region = '대전광역시'
  AND bid_method = '수의계약'
  AND contract_date >= '2023-01-01'
GROUP BY org
ORDER BY 총계약액 DESC
LIMIT 20;
특정 기간·기관 계약 목록
날짜는 'YYYY-MM-DD' 형식. BETWEEN 으로 기간 지정.
SELECT org, vendor, contract_name, contract_amount, contract_date, bid_method
FROM contracts
WHERE org LIKE '%대전광역시교육청%'
  AND contract_date BETWEEN '2024-01-01' AND '2024-12-31'
ORDER BY contract_amount DESC;
📜

의안·법안 추적

DB: civic · 테이블: bills · bill_type: 'national_bill'(국회) 'local_bill'(지방의회)

대전시의회 최근 의안 목록
result 값: 가결 / 부결 / 폐기 / 계류 등.
SELECT bill_name, proposer, propose_date, committee, result
FROM bills
WHERE org LIKE '%대전광역시의회%'
ORDER BY propose_date DESC
LIMIT 50;
특정 의원이 발의한 의안 전체
이름 일부만 입력해도 됩니다.
SELECT bill_name, org, propose_date, committee, result
FROM bills
WHERE proposer LIKE '%홍길동%'   -- 의원 이름을 넣으세요
ORDER BY propose_date DESC;
키워드로 의안 검색
제목에 특정 단어가 포함된 의안을 찾습니다.
SELECT bill_name, org, proposer, propose_date, result
FROM bills
WHERE bill_name LIKE '%청년%'    -- 검색할 키워드를 넣으세요
   OR bill_name LIKE '%복지%'
ORDER BY propose_date DESC
LIMIT 100;
💰

재정·결산 분석

DB: integrated · 테이블: settlement(결산) contract(계약 정리본) subsidy(보조금)

gov_code: 대전광역시 3000000 / 동구 3011000 / 중구 3012000 / 서구 3013000 / 유성구 3014000 / 대덕구 3015000 / 대전교육청 EDU-DJ
대전광역시 세출 결산 (연도별 상위 항목)
어느 분야에 가장 많이 지출했는지 파악.
SELECT fiscal_year, category_name, amount
FROM settlement
WHERE gov_code = '3000000'       -- 대전광역시
  AND fiscal_year >= 2020
ORDER BY fiscal_year DESC, amount DESC
LIMIT 50;
부서별 계약 건수 및 총액 순위
정리본 테이블 사용. 부서 분류가 정제되어 분석에 적합.
SELECT dept_norm AS 부서명,
       dept_category AS 분류,
       COUNT(*) AS 계약건수,
       SUM(amount) AS 총액
FROM contract
WHERE gov_code = '3000000'
  AND fiscal_year >= 2022
GROUP BY dept_norm
ORDER BY 총액 DESC
LIMIT 20;
대전시 구별 결산 비교 (동일 연도)
5개 자치구를 한 번에 비교합니다.
SELECT gov_code, category_name, amount
FROM settlement
WHERE gov_code IN ('3011000','3012000','3013000','3014000','3015000')
  AND fiscal_year = 2023
ORDER BY gov_code, amount DESC;
보조금 사업 항목 순위
어떤 사업에 보조금이 가장 많이 집행됐는지.
SELECT fiscal_year, category_name,
       SUM(amount) AS 총보조금액
FROM subsidy
WHERE gov_code = '3000000'
GROUP BY fiscal_year, category_name
ORDER BY fiscal_year DESC, 총보조금액 DESC
LIMIT 30;
📢

입법예고 모니터링

DB: elis · 테이블: notices · 하루 수차례 자동 수집. 의견 제출 기한 전에 확인하세요.

주의: end_date는 2026-06-29 와 2026. 7. 13. 형식이 함께 들어 있습니다. 아래 예시는 두 형식을 모두 정규화해서 조회하도록 작성했습니다.
현재 의견 수렴 중인 입법예고
오늘 기준 마감일이 지나지 않은 항목만.
WITH notice_src AS (
  SELECT *,
         rtrim(replace(replace(replace(replace(trim(end_date), char(160), ''), ' ', ''), '.', '/'), '-', '/'), '/') AS ds
  FROM notices
  WHERE end_date IS NOT NULL AND end_date != ''
), notice_parts AS (
  SELECT *,
         substr(ds, 1, instr(ds, '/') - 1) AS y,
         substr(ds, instr(ds, '/') + 1) AS rest1
  FROM notice_src
  WHERE instr(ds, '/') > 0
), notice_norm AS (
  SELECT title, ministry, field, start_date, end_date, url,
         date(printf(
           '%04d-%02d-%02d',
           CAST(y AS INTEGER),
           CAST(substr(rest1, 1, instr(rest1, '/') - 1) AS INTEGER),
           CAST(substr(rest1, instr(rest1, '/') + 1) AS INTEGER)
         )) AS end_date_norm
  FROM notice_parts
  WHERE instr(rest1, '/') > 0
)
SELECT title, ministry, field, start_date, end_date, url
FROM notice_norm
WHERE end_date_norm >= date('now')
ORDER BY end_date_norm ASC;
특정 분야·부처 입법예고 검색
field(분야) 또는 ministry(부처명)로 필터링.
SELECT title, ministry, field, start_date, end_date, url
FROM notices
WHERE field LIKE '%환경%'        -- 분야 키워드
   OR title LIKE '%환경%'        -- 제목에 키워드 포함
ORDER BY start_date DESC
LIMIT 50;
최근 30일 입법예고 부처별 건수
어느 부처에서 가장 많은 예고를 올렸는지.
WITH notice_src AS (
  SELECT ministry,
         rtrim(replace(replace(replace(replace(trim(start_date), char(160), ''), ' ', ''), '.', '/'), '-', '/'), '/') AS ds
  FROM notices
  WHERE start_date IS NOT NULL AND start_date != ''
), notice_parts AS (
  SELECT ministry,
         substr(ds, 1, instr(ds, '/') - 1) AS y,
         substr(ds, instr(ds, '/') + 1) AS rest1
  FROM notice_src
  WHERE instr(ds, '/') > 0
)
SELECT ministry, COUNT(*) AS 건수
FROM (
  SELECT ministry,
         date(printf(
           '%04d-%02d-%02d',
           CAST(y AS INTEGER),
           CAST(substr(rest1, 1, instr(rest1, '/') - 1) AS INTEGER),
           CAST(substr(rest1, instr(rest1, '/') + 1) AS INTEGER)
         )) AS start_date_norm
  FROM notice_parts
  WHERE instr(rest1, '/') > 0
)
WHERE start_date_norm >= date('now', '-30 days')
GROUP BY ministry
ORDER BY 건수 DESC;
💡

자주 쓰는 패턴 & 팁

금액을 억 원 단위로 보기
숫자가 너무 길 때 ROUND로 반올림.
SELECT org, vendor, contract_name,
       ROUND(contract_amount / 100000000.0, 1) AS 금액_억원,
       contract_date
FROM contracts
WHERE region = '대전광역시'
  AND contract_amount >= 100000000
ORDER BY contract_amount DESC
LIMIT 30;
연도별 추이 집계
substr() 로 날짜에서 연도만 뽑습니다.
SELECT substr(contract_date, 1, 4) AS 연도,
       COUNT(*) AS 계약건수,
       ROUND(SUM(contract_amount) / 100000000.0) AS 총액_억원
FROM contracts
WHERE region = '대전광역시'
  AND bid_method = '수의계약'
GROUP BY 연도
ORDER BY 연도 DESC;
두 조건 중 하나 (OR) 사용 예시
대전 또는 세종에서 체결된 계약.
SELECT org, vendor, contract_name, contract_amount, region
FROM contracts
WHERE (region = '대전광역시' OR region = '세종특별자치시')
  AND bid_method = '수의계약'
  AND contract_amount >= 50000000
ORDER BY contract_amount DESC
LIMIT 50;
결과가 너무 많을 때: LIMIT 숫자를 줄이거나 WHERE 조건을 더 추가하세요.
결과가 하나도 없을 때: LIKE의 % 위치를 확인하거나 값의 오타를 점검하세요. 예) LIKE '%대전%'으로 먼저 시도하세요.
Powered by Datasette