COUNT DISTINCT กับเงื่อนไข


109

ฉันต้องการนับจำนวนรายการที่แตกต่างกันในคอลัมน์ภายใต้เงื่อนไขบางประการเช่นหากตารางเป็นเช่นนี้:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

หากฉันต้องการนับจำนวนแท็กที่แตกต่างกันเป็น "จำนวนแท็ก" และนับจำนวนแท็กที่แตกต่างกันโดยมีรหัสรายการ> 0 เป็น "จำนวนแท็กบวก" ในตารางเดียวกันฉันควรทำอย่างไร

ตอนนี้ฉันกำลังนับจากสองตารางที่แตกต่างกันโดยที่ในตารางที่สองฉันเลือกเฉพาะแถวที่มี entryID มากกว่าศูนย์ ฉันคิดว่าควรมีวิธีที่กระชับกว่านี้ในการแก้ปัญหานี้

คำตอบ:


266

คุณสามารถลองสิ่งนี้:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

อย่างแรกcount(distinct...)เป็นเรื่องง่าย อันที่สองดูค่อนข้างซับซ้อนจริง ๆ แล้วก็เหมือนกับอันแรกยกเว้นว่าคุณใช้case...whenอนุประโยค ในcase...whenข้อนี้คุณจะกรองเฉพาะค่าบวกเท่านั้น ค่าศูนย์หรือค่าลบจะได้รับการประเมินเป็นnullและจะไม่รวมอยู่ในการนับ

สิ่งหนึ่งที่ควรทราบก็คือสามารถทำได้โดยการอ่านตารางครั้งเดียว เมื่อดูเหมือนว่าคุณต้องอ่านตารางเดียวกันสองครั้งขึ้นไปก็สามารถทำได้โดยการอ่านครั้งเดียวเกือบตลอดเวลา ด้วยเหตุนี้จะทำให้งานเสร็จเร็วขึ้นมากโดยมี I / O น้อยลง


2
แต่ positive_tag_count จะแตกต่างกันด้วยหรือไม่
derekhh

คำค้นหาที่แก้ไขแล้วยังไม่สามารถแก้ปัญหาได้ - ตอนนี้ยังไม่ทำงานกับค่า entryId ที่แตกต่างกันแทนที่จะเป็นแท็กเฉพาะ
BrianC

นี่เป็นวิธีการแก้ปัญหาที่ชาญฉลาดจริงๆ
ลัค

ฉันมีคอลัมน์ที่แตกต่างกันหลายคอลัมน์ (จำนวนตัวอย่าง (แท็กที่แตกต่างกันวันที่)) มีวิธีที่จะมีหลายคอลัมน์ในประโยคแล้ว ถ้าฉันแค่ทำแท็กวันที่มันมีข้อยกเว้นในการแยกวิเคราะห์
Crusaderpyro

@Crusaderpyro นั่นอยู่นอกเหนือขอบเขตของคำถามเดิม ฉันจะสร้างคำถามใหม่สำหรับสิ่งนั้น
ntalbs

2

ลองใช้ข้อความต่อไปนี้:

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

ฟิลด์แรกจะเป็นแท็กส่วนที่สองจะเป็นจำนวนทั้งหมดส่วนที่สามจะเป็นจำนวนบวก


1

สิ่งนี้อาจใช้ได้:

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

และ

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag

0

สิ่งนี้อาจใช้งานได้:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

คุณต้องมีเงื่อนไข entryID ในการรวมด้านซ้ายแทนที่จะอยู่ในส่วนคำสั่ง where เพื่อให้แน่ใจว่ารายการใด ๆ ที่มีเพียง entryID เป็น 0 จะได้รับการนับอย่างถูกต้องใน DISTINCT แรก


1
แบบสอบถามนี้อ่านตารางสองครั้ง สามารถทำได้โดยการอ่านตารางเพียงครั้งเดียว
ntalbs

0

โค้ดจะนับการรวมแท็กและรหัสรายการที่ไม่ซ้ำกัน / ไม่ซ้ำกันเมื่อ [รหัสรายการ]> 0

select count(distinct(concat(tag,entryId)))
from customers
where id>0

ในผลลัพธ์จะแสดงจำนวนค่าที่ไม่ซ้ำกันหวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.