นับจำนวนระเบียนที่ส่งคืนโดยจัดกลุ่มโดย


144

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

เช่น:

select count(*) 
from temptable
group by column_1, column_2, column_3, column_4

ให้ฉัน,

1
1
2

ฉันต้องนับบันทึกข้างต้นเพื่อรับ 1 + 1 + 1 = 3


3
@LorenVS: แต่นั่นจะทำให้ฉันนับจำนวนระเบียนในตาราง ฉันต้องการจำนวนบันทึกหลังจากที่กลุ่มเกิดขึ้น
คริส

3
การจัดกลุ่มตามจะไม่เปลี่ยนจำนวนแถว 1 + 1 + 2 (ในตัวอย่างของคุณ) จะเป็นจำนวนแถวในตาราง คุณกำลังมองหา 3? จำนวนกลุ่มที่แตกต่างกัน?
LorenVS

2
อีกวิธีหนึ่งในการกำหนดคำถาม: ฉันจะเลือกจำนวนระดับการจัดกลุ่มที่แตกต่างกันสำหรับแบบสอบถามหนึ่ง ๆ ได้อย่างไร
Julian

ไม่ชัดเจนเสมอไปว่าทำไมผู้ใช้ถึงถามคำถาม แต่ฉันมาที่นี่เพราะฉันกำลังทดสอบว่าคอลัมน์ในมุมมองเป็นคีย์หลักหรือคีย์ผสมของตัวเลือกหรือไม่ "เลือกจำนวน (COLUMNNAME ที่แตกต่างกัน) จาก VIEWNAME" หมดเวลาโดยจัดกลุ่มตามผลถ้าฉันได้รับผลรวม
Ken Forslund

คำตอบ:


172

คุณสามารถทำทั้งสองอย่างในแบบสอบถามเดียวโดยใช้คำสั่ง OVER กับอีก COUNT

select
    count(*) RecordsPerGroup,
    COUNT(*) OVER () AS TotalRecords
from temptable
group by column_1, column_2, column_3, column_4

ฉันรู้ว่านี่เป็นคำถาม SQL-Server แต่สำหรับการอ้างอิง: สิ่งนี้ใช้ไม่ได้บน DB / 2 (ในกรณีของฉันบน IBM iSeries) ดูความคิดเห็นของฉันได้ที่คำตอบของ
Thomas

ฉันจะสะท้อนจำนวนที่นับได้อย่างไร
McDan Garrett

1
ข้อเสียของโซลูชันนี้คือให้คำตอบหลายครั้ง (สำหรับชุดค่าผสมแต่ละชุดcolumn_1, column_2, column_3, column_4) นี่อาจเป็นผลข้างเคียงที่สำคัญหรือไม่ก็ได้ขึ้นอยู่กับว่าคุณประมวลผลผลลัพธ์อย่างไร
cartbeforehorse

5
หากต้องการส่งคืนเพียงจำนวนระเบียนให้เพิ่มการเลือกด้านบน (1) count (*) ทับ () เป็น ....
Guilherme Campos Hazan

3
ในกรณีของฉันที่ใช้ TOP (1) COUNT ( ) OVER () มีประสิทธิภาพการสืบค้นต่ำ เนื่องจากฉันต้องการจำนวนกลุ่มเท่านั้นฉันจึงเปลี่ยนสิ่งนี้เป็น DISTINCT COUNT ( ) OVER () และประสิทธิภาพการสืบค้นก็ดีขึ้นอย่างมาก
Joe Aldrich

75

ทางออกที่ง่ายที่สุดคือการใช้ตารางที่ได้รับ:

Select Count(*)
From    (
        Select ...
        From TempTable
        Group By column_1, column_2, column_3, column_4
        ) As Z

อีกวิธีหนึ่งคือการใช้ Count Distinct:

Select ...
    , ( Select Count( Distinct column_1, column_2, column_3, column_4 )
        From TempTable ) As CountOfItems
From TempTable
Group By column_1, column_2, column_3, column_4

คำตอบแรกใช้ได้กับ DB / 2 เช่นกัน แต่ด้วยเหตุผลบางประการจำเป็นต้องมีการเพิ่ม AS TMP เพื่อให้ทำงานได้ (เช่นเพิ่มเทราไทเซอร์)
Bjinse

5
@Bjinse - DBMS บางตัวจะกำหนดให้ตารางที่ได้รับทั้งหมดมีนามแฝง พวกเขาทั้งหมดจะยอมรับดังนั้นมันจะไม่เจ็บที่จะรวมไว้ ฉันจะเพิ่มในคำตอบของฉัน
โทมัส

26

ฉันรู้ว่ามันค่อนข้างสาย แต่ไม่มีใครแนะนำสิ่งนี้:

select count ( distinct column_1, column_2, column_3, column_4) 
from   temptable

อย่างน้อยก็ใช้งานได้ใน Oracle - ตอนนี้ฉันไม่มีฐานข้อมูลอื่นให้ทดสอบและฉันไม่ค่อยคุ้นเคยกับไวยากรณ์ T-Sql และ MySQL

นอกจากนี้ฉันไม่แน่ใจว่ามันจะมีประสิทธิภาพมากกว่าในตัววิเคราะห์หรือไม่หรือวิธีแก้ปัญหาของคนอื่นในการซ้อนคำสั่ง select จะดีกว่า แต่ฉันพบว่าอันนี้ดูหรูหรากว่าจากมุมมองการเข้ารหัส


โทมัสเพิ่มคำตอบของคุณในคำตอบของเขา อย่างไรก็ตาม. ฉันไม่แนะนำให้ทำสิ่งนี้ด้วยเหตุผลด้านการบำรุงรักษาวิธีแก้ปัญหาอื่น ๆ นั้นดีกว่ามาก
Răzvan Flavius ​​Panda

@ RăzvanFlaviusPanda 1. ทำไม? อะไรที่ดีกว่าเกี่ยวกับโซลูชันอื่น ๆ ? การซ้อน SQL นั้นละเอียดกว่าและในสายตาของฉันยุ่งมากขึ้นและเข้าใจยากขึ้น (ยากที่จะรักษาในแง่การสนับสนุน) ฉันเข้าใจว่าคุณอาจชอบวิธีอื่น แต่นั่นไม่ใช่เหตุผลที่จะ "แนะนำ" มากกว่าความชอบของคนอื่น Thomas ได้ให้คำแนะนำที่คล้ายกันใช่ แต่อีกครั้งเขาทำให้ดูเหมือนว่าการซ้อน SQL เป็นส่วนที่จำเป็นของโซลูชันซึ่งไม่ใช่
รถเข็นก่อน

12

ฉันพยายามที่จะบรรลุสิ่งเดียวกันโดยไม่มีการสืบค้นย่อยและได้ผลลัพธ์ที่ต้องการดังต่อไปนี้

SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
FROM temptable
GROUP BY column_1, column_2, column_3, column_4





1

คุณสามารถรันโค้ดด้านล่างนี้ได้ไหม มันทำงานใน Oracle

SELECT COUNT(COUNT(*))
FROM temptable
GROUP BY column_1, column_2, column_3, column_4

1
ไม่สามารถเรียกใช้การรวมภายในการรวมบนเซิร์ฟเวอร์ sql
A. Greensmith

0

คุณสามารถรับได้จากแบบสอบถามด้านล่าง

select column_group_by,count(*) as Coulm_name_to_be_displayed from Table group by Column;

-- For example:
select city,count(*) AS Count from people group by city


0

ต่อไปนี้สำหรับPrestoDbโดยที่ FirstField สามารถมีได้หลายค่า:

select *
            , concat(cast(cast((ThirdTable.Total_Records_in_Group * 100 / ThirdTable.Total_Records_in_baseTable) as DECIMAL(5,2)) as varchar), '%') PERCENTage
from 
(
    SELECT FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable, count(*) Total_Records_in_Group
    FROM BaseTable FirstTable
    JOIN (
            SELECT FK1, count(*) AS Total_Records_in_baseTable 
            FROM BaseTable
            GROUP BY FK1
        ) SecondTable
    ON FirstTable.FirstField = SecondTable.FK1
    GROUP BY FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable
    ORDER BY FirstTable.FirstField, FirstTable.SecondField
) ThirdTable

-1

วิธีการใช้ฟังก์ชันแบ่งพาร์ติชัน COUNT OVER (PARTITION BY {เพื่อจัดกลุ่มโดย}) ใน SQL Server

ตัวอย่างเช่นหากคุณต้องการจัดกลุ่มการขายผลิตภัณฑ์ตาม ItemID และคุณต้องการนับ ItemID แต่ละรายการที่แตกต่างกันให้ใช้:

SELECT
{columns you want} ,
COUNT(ItemID) OVER (PARTITION BY ItemID) as BandedItemCount ,
{more columns you want}... ,
FROM {MyTable}

หากคุณใช้วิธีนี้คุณสามารถปล่อย GROUP BY ออกจากรูปภาพได้โดยสมมติว่าคุณต้องการส่งคืนรายการทั้งหมด (เนื่องจากคุณอาจรายงานแถบที่คุณต้องทราบจำนวนรายการทั้งหมดที่คุณจะรวมวงโดยไม่ต้องมี เพื่อแสดงชุดข้อมูลทั้งหมดนั่นคือ Reporting Services)


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