| Version 19 (modified by , 9 months ago) ( diff ) |
|---|
Напредни извештаи од базата (SQL и складирани процедури)
Извештај за членови со најмногу позајмувања по месец
SELECT
users.FirstName,
users.LastName,
EXTRACT(MONTH FROM loan.LoanDate) AS month,
COUNT(loan.LoanID) AS loan_count
FROM users
INNER JOIN loan ON users.UserID = loan.MemberID
WHERE EXTRACT(MONTH FROM loan.LoanDate) = 4 -- Change this number for different months (1-12)
GROUP BY
users.UserID,
users.FirstName,
users.LastName,
EXTRACT(MONTH FROM loan.LoanDate)
ORDER BY loan_count DESC
LIMIT 5;
Извештај за најпозајмени книги по тримесечие
SELECT
book.CoverImage,
book.Title,
book.Genre,
author.FirstName,
author.LastName,
EXTRACT(QUARTER FROM loan.LoanDate) AS quarter,
COUNT(loan.LoanID) AS loan_count
FROM book
INNER JOIN book_copies ON book.BookID = book_copies.BookID
LEFT JOIN loan ON book_copies.CopyID = loan.BookCopyID
INNER JOIN book_author ON book.BookID = book_author.BookID
INNER JOIN author ON book_author.AuthorID = author.AuthorID
WHERE EXTRACT(QUARTER FROM loan.LoanDate) = 4 -- Change this number (1-4) for different quarters
GROUP BY
book.BookID,
book.Title,
book.CoverImage,
book.Genre,
author.FirstName,
author.LastName,
EXTRACT(QUARTER FROM loan.LoanDate)
ORDER BY loan_count DESC
LIMIT 5;
Извештај за најмалку позајмувани книги по тримесечие
SELECT
book.CoverImage,
book.Title,
book.Genre,
author.FirstName,
author.LastName,
EXTRACT(QUARTER FROM loan.LoanDate) AS quarter,
COUNT(loan.LoanID) AS loan_count
FROM book
INNER JOIN book_copies ON book.BookID = book_copies.BookID
LEFT JOIN loan ON book_copies.CopyID = loan.BookCopyID
INNER JOIN book_author ON book.BookID = book_author.BookID
INNER JOIN author ON book_author.AuthorID = author.AuthorID
WHERE EXTRACT(QUARTER FROM loan.LoanDate) = 4 -- Change this number (1-4) for different quarters
GROUP BY
book.BookID,
book.Title,
book.CoverImage,
book.Genre,
author.FirstName,
author.LastName,
EXTRACT(QUARTER FROM loan.LoanDate)
ORDER BY loan_count ASC
LIMIT 5;
Извештај за сума на платени и неплатени казни во текот на годината
SELECT
EXTRACT(YEAR FROM finedate) AS fine_year,
SUM(CASE WHEN status = 'Paid' THEN fineamount ELSE 0 END) AS total_paid,
SUM(CASE WHEN status = 'Unpaid' THEN fineamount ELSE 0 END) AS total_unpaid,
SUM(fineamount) AS total_fines
FROM fine
WHERE EXTRACT(YEAR FROM finedate) = 2024 -- Change year as needed
GROUP BY EXTRACT(YEAR FROM finedate)
ORDER BY fine_year;
Извештај за задоцнети враќања и просечно доцнење по месец
SELECT
EXTRACT(YEAR FROM LoanDate) as year,
EXTRACT(MONTH FROM LoanDate) as month,
COUNT(*) as total_late_returns,
AVG(ReturnDate - LoanDate) as avg_days_late
FROM Loan
WHERE ReturnDate > LoanDate + INTERVAL '14 days'
GROUP BY
EXTRACT(YEAR FROM LoanDate),
EXTRACT(MONTH FROM LoanDate)
ORDER BY year, month;
Извештај за кондиција на книга
SELECT
b.Title,
bc.Condition,
COUNT(*) as copy_count
FROM Book b
JOIN Book_Copies bc ON b.BookID = bc.BookID
GROUP BY b.Title, bc.Condition
ORDER BY b.Title;
Извештај за членовите
SELECT
u.FirstName,
u.LastName,
COUNT(l.LoanID) as total_loans,
COUNT(f.FineID) as total_fines,
SUM(f.FineAmount) as total_fine_amount
FROM Users u
JOIN Member m ON u.UserID = m.UserID
LEFT JOIN Loan l ON m.MemberID = l.MemberID
LEFT JOIN Fine f ON l.LoanID = f.LoanID
GROUP BY u.UserID, u.FirstName, u.LastName
ORDER BY total_loans DESC;
Извештај за анализа на времето за враќање
SELECT
b.Title,
AVG(l.ReturnDate - l.LoanDate) as AvgDaysToReturn,
MIN(l.ReturnDate - l.LoanDate) as MinDaysToReturn,
MAX(l.ReturnDate - l.LoanDate) as MaxDaysToReturn,
COUNT(*) as TotalLoans,
COUNT(CASE WHEN f.FineID IS NOT NULL THEN 1 END) as LoansWithFines
FROM
Loan l
JOIN Book_Copies bc ON l.BookCopyID = bc.CopyID
JOIN Book b ON bc.BookID = b.BookID
LEFT JOIN Fine f ON l.LoanID = f.LoanID
WHERE
l.ReturnDate IS NOT NULL
GROUP BY
b.BookID, b.Title
HAVING
COUNT(*) >= 5 -- Only show books with at least 5 loans
ORDER BY
AVG(l.ReturnDate - l.LoanDate) DESC;
Извештај за активност на членови
WITH DateRanges AS (
SELECT
generate_series(
date_trunc('year', CURRENT_DATE) - interval '5 year',
date_trunc('year', CURRENT_DATE),
interval '1 year'
) as start_date,
generate_series(
date_trunc('year', CURRENT_DATE) - interval '4 year',
date_trunc('year', CURRENT_DATE),
interval '1 year'
) as end_date
)
SELECT
u.FirstName || ' ' || u.LastName as MemberName,
m.Membership_Status,
d.start_date::date as PeriodStart,
d.end_date::date as PeriodEnd,
COUNT(DISTINCT l.LoanID) as TotalLoans,
COUNT(DISTINCT CASE WHEN l.ReturnDate IS NULL THEN l.LoanID END) as ActiveLoans,
COUNT(DISTINCT f.FineID) as TotalFines,
COALESCE(SUM(f.FineAmount), 0) as TotalFineAmount,
COALESCE(SUM(fp.PaymentAmount), 0) as TotalPaidAmount
FROM
DateRanges d
CROSS JOIN Member m
JOIN Users u ON m.UserID = u.UserID
LEFT JOIN Loan l ON m.MemberID = l.MemberID
AND l.LoanDate >= d.start_date
AND l.LoanDate < d.end_date
LEFT JOIN Fine f ON l.LoanID = f.LoanID
LEFT JOIN FinePayment fp ON f.FineID = fp.FineID
GROUP BY
u.FirstName, u.LastName, m.Membership_Status, d.start_date, d.end_date
ORDER BY
d.start_date DESC, TotalLoans DESC;
Note:
See TracWiki
for help on using the wiki.