Bộ phận PostgreSQL trong truy vấn không hoạt động


7

Vì vậy, tôi đang có một ngày thực sự nghỉ hoặc một cái gì đó, nhưng đối với cuộc sống của tôi, tôi không thể tìm ra điều này. Tôi cố gắng để phân chia tier1bởi totalđể có được một tỷ lệ phần trăm của tổng số. Tôi đã nghĩ như thế này:

(tier1 / total) as per

Nhưng không có may mắn. Tôi có CAST những cái này như int và vẫn không có gì. Tôi sẽ gặp lỗi và truy vấn sẽ không thực thi hoặc tôi sẽ nhận được giá trị 0.

Đây là những gì tôi đang cố gắng làm việc với:

SELECT count(student_id) as total
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
FROM national_assessments.aimsweb
WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL

Tôi cũng có ý tưởng này nhưng không có may mắn:

SELECT tier1,total, tier1/total as test
FROM (
    SELECT count(student_id) as total
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
    FROM national_assessments.aimsweb
    WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL
) as test

Câu trả lời:


11

Số nguyên chia cắt các chữ số phân số. Biểu thức của bạn trả về tỷ lệ giữa 0 và 1, luôn bị cắt ngắn thành 0.

Để có được "tỷ lệ phần trăm", trước tiên hãy nhân với 100.
Để có được các chữ số phân số, hãy chuyển sang numeric(trước khi bạn chia) - hoặc nhân với 100.0. Sự hiện diện của một chữ số phân số trong chữ số cưỡng chế kết quả numerictự động.

Thông thường, bạn sẽ làm tròn đến hai chữ số phân số hoặc một cái gì đó. Sử dụng round()cho điều đó (chỉ hoạt động cho numeric).

Thêm một số tối ưu hóa cơ bản khác vào truy vấn bạn nhận được:

SELECT total
      ,tier1, round((tier1 * 100.0) / total, 2) AS tier1_pct
      ,tier2, round((tier2 * 100.0) / total, 2) AS tier2_pct
      ,tier3, round((tier3 * 100.0) / total, 2) AS tier3_pct
FROM  (
   SELECT count(*) AS total
         ,count(fall_september_tier = 1 OR NULL) AS tier1
         ,count(fall_september_tier = 2 OR NULL) AS tier2
         ,count(fall_september_tier = 3 OR NULL) AS tier3
   FROM   national_assessments.aimsweb
   WHERE  general_outcome_measure = 'PSF'
   AND    fall_september_tier IS NOT NULL
   ) sub;

Giải thích cho kỹ thuật đếm:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.