วิธีนับเมื่อไม่ทราบประเภทเฉพาะ

ฉันกำลังทำงานบนโต๊ะแบบนี้:

id type
1 A
2 A
3 B
4 C
5 C

ฉันต้องการนับจำนวนรหัสสำหรับแต่ละประเภทและได้ตารางแบบนี้

type_a type_b type_c
2 1 2

สิ่งที่ฉันทำคือ

SELECT 
    SUM(CASE WHEN type = 'A' THEN 1 ELSE 0 END) AS type_a,
    SUM(CASE WHEN type = 'B' THEN 1 ELSE 0 END) AS type_b,
    SUM(CASE WHEN type = 'C' THEN 1 ELSE 0 END) AS type_c
FROM myTable

คำถามของฉันคือ ถ้าฉันไม่รู้ว่ามีกี่ประเภท และไม่สามารถระบุทุกกรณีได้โดยเฉพาะ ฉันจะบรรลุได้อย่างไร


person Erin Liu    schedule 16.04.2021    source แหล่งที่มา
comment
คงจะง่ายกว่ามากถ้าส่งคืนผลลัพธ์เป็นสองคอลัมน์: Type, Count   -  person Janez Kuhar    schedule 16.04.2021
comment
จากนั้นคุณต้องใช้ไดนามิก sql   -  person eshirvana    schedule 16.04.2021
comment
สิ่งนี้ตอบคำถามของคุณหรือไม่? แบบสอบถาม Pivot แบบไดนามิกโดยใช้ PostgreSQL 9.3   -  person PM 77-1    schedule 16.04.2021


คำตอบ (2)


คุณกำลังมองหาตารางแบบตารางไขว้หรือตารางเดือย ฉันเพิ่มแท็กแล้ว
อย่างไรก็ตาม:

ถ้าฉันไม่รู้ว่ามีกี่ประเภท และไม่สามารถระบุทุกกรณีได้โดยเฉพาะ ฉันจะบรรลุได้อย่างไร

โดยพื้นฐานแล้ว นั่น เป็นไปไม่ได้ ในการสืบค้น SQL เดียว เนื่องจาก SQL ต้องการทราบจำนวนคอลัมน์ผลลัพธ์ ณ เวลาที่โทร ไม่สามารถส่งคืนจำนวนคอลัมน์แบบไดนามิกตามหลักการได้

มีวิธีแก้ไขปัญหาต่างๆ มากมายสำหรับประเภท polymorphic หรือประเภทเอกสาร เช่น json, jsonb, hstore หรือ xml หรือส่งคืนอาร์เรย์แทนแต่ละคอลัมน์ ...

แต่เพื่อให้ได้สิ่งที่คุณต้องการ คอลัมน์เฉพาะที่ไม่ทราบจำนวน คุณต้องมีเวิร์กโฟลว์สองขั้นตอน ชอบ:

  1. สร้างแบบสอบถามแบบไดนามิก (การกำหนดประเภทการส่งคืน)
  2. ดำเนินการมัน

ที่เกี่ยวข้อง:

อย่างไรก็ตาม หากกรณีของคุณ เรียบง่าย และคุณจัดการกับ ประเภทที่รู้จักเต็มมือ คุณก็สามารถ จัดสรรมากเกินไป ได้ ด้วยการสืบค้น crosstab() ที่เร็วขึ้น หรือด้วยการรวมตามเงื่อนไขอย่างง่าย ๆ เช่นเดียวกับที่คุณมี จะสวยงามและมีประสิทธิภาพยิ่งขึ้นด้วยการรวมส่วนคำสั่ง FILTER:

SELECT count(*) FILTER (WHERE type = 'A') AS type_a
     , count(*) FILTER (WHERE type = 'B') AS type_b
     , count(*) FILTER (WHERE type = 'C') AS type_c
     , count(*) FILTER (WHERE type = 'D') AS type_d
     -- that's all folks!
FROM   tbl;

ประเภทที่ไม่มีรายการรายงาน 0 (count() ไม่เคยส่งคืน NULL) ซึ่งจะถูกต้องอยู่แล้ว

ใช้งานไม่ได้กับประเภทที่ไม่รู้จักอย่างเห็นได้ชัด

person Erwin Brandstetter    schedule 17.04.2021

ถ้าฉันเข้าใจคุณถูกต้อง สิ่งที่คุณต้องการก็แค่ COUNT ง่ายๆ:

SELECT
    type
    ,COUNT(id)
FROM myTable
GROUP BY type
person Don R    schedule 16.04.2021
comment
มีคอลัมน์อื่นๆ ที่ฉันต้องการเพิ่ม ตัวอย่างเช่น: จำนวน เปอร์เซ็นต์ ฯลฯ และต้องการให้เป็นประเภทสำหรับแต่ละคอลัมน์ สำหรับแถวแรกเป็นการนับแต่ละประเภท และสำหรับแถวที่สอง จะเป็นเปอร์เซ็นต์ของแต่ละประเภท (เปอร์เซ็นต์ = จำนวนแต่ละประเภท / จำนวนรหัสทั้งหมด) - person Erin Liu; 17.04.2021