แบบสอบถาม SQL Server - การเลือก COUNT (*) ด้วย DISTINCT


431

ใน SQL Server 2005 ฉันมีตาราง cm_production ที่แสดงรหัสทั้งหมดที่นำไปผลิต ตารางมี ticket_number, program_type และ program_name และ push_number พร้อมกับคอลัมน์อื่น ๆ

เป้าหมาย: นับชื่อโปรแกรม DISTINCT ทั้งหมดตามประเภทโปรแกรมและหมายเลขพุช

สิ่งที่ฉันมีอยู่คือ:

DECLARE @push_number INT;
SET @push_number = [HERE_ADD_NUMBER];

SELECT DISTINCT COUNT(*) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

นี่ทำให้ฉันอยู่ตรงนั้น แต่นับชื่อโปรแกรมทั้งหมดไม่ใช่ชื่อที่ต่างกัน (ซึ่งฉันไม่คิดว่าจะทำในแบบสอบถามนั้น) ฉันเดาว่าฉันไม่สามารถคาดเดาวิธีที่จะบอกให้นับเฉพาะชื่อโปรแกรมที่แตกต่างได้โดยไม่ต้องเลือก หรือบางสิ่งบางอย่าง.

คำตอบ:


729

นับชื่อโปรแกรม DISTINCT ทั้งหมดตามประเภทโปรแกรมและหมายเลข push

SELECT COUNT(DISTINCT program_name) AS Count,
  program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

DISTINCT COUNT(*)จะส่งคืนแถวสำหรับการนับที่ไม่ซ้ำแต่ละครั้ง สิ่งที่คุณต้องการคือCOUNT(DISTINCT <expression>): ประเมินการแสดงออกของแต่ละแถวในกลุ่มและส่งกลับจำนวนของค่าที่ไม่ซ้ำกันและไม่มีค่า


110

ฉันต้องการรับจำนวนการเกิดขึ้นของแต่ละค่าที่แตกต่างกัน คอลัมน์มีข้อมูลภูมิภาค แบบสอบถาม SQL ง่าย ๆ ที่ฉันลงเอยคือ:

SELECT Region, count(*)
FROM item
WHERE Region is not null
GROUP BY Region

ซึ่งจะให้รายการเหมือนฉันพูด:

Region, count
Denmark, 4
Sweden, 1
USA, 10

hey @ Netsi1964 ใช้แบบสอบถามเดียวกัน แต่ฉันต้องการภูมิภาครัฐนับมันเป็นไปได้ไหม โปรดช่วยฉันด้วย

48

คุณต้องสร้างตารางที่ได้มาสำหรับคอลัมน์ที่แตกต่างจากนั้นทำการสอบถามจำนวนจากตารางนั้น

SELECT COUNT(*) 
FROM (SELECT DISTINCT column1,column2
      FROM  tablename  
      WHERE condition ) as dt

นี่dtคือตารางที่ได้รับ


1
ขอบคุณ! ฉันใช้ SQL จำนวนมากในชีวิตของฉันกับฐานข้อมูลจำนวนมากและนี่เป็นครั้งแรกที่ฉันต้องมีคุณสมบัติเป็นตารางอุณหภูมิที่มี "as X"
อืม

6
โปรดทราบว่าคำศัพท์ปกติสำหรับ "dt" ที่นี่คือตารางที่ได้รับไม่ใช่ตาราง temp
8forty


15

ลองนี้:

SELECT
    COUNT(program_name) AS [Count],program_type AS [Type]
    FROM (SELECT DISTINCT program_name,program_type
              FROM cm_production 
              WHERE push_number=@push_number
         ) dt
    GROUP BY program_type

-1

นี่เป็นตัวอย่างที่ดีที่คุณต้องการรับจำนวนพินโคดซึ่งเก็บไว้ในฟิลด์ที่อยู่สุดท้าย

SELECT DISTINCT
    RIGHT (address, 6),
    count(*) AS count
FROM
    datafile
WHERE
    address IS NOT NULL
GROUP BY
    RIGHT (address, 6)

-6
select  count (distinct NumTar),'PROPIAS'
from ATM_TRANe with (nolock)
where Fecha>='2014-01-01'
  AND Fecha<='2015-05-31'and NetDestino=0
  and SystemCodResp=0
group by NetDestino 
union 
select sum (contar),'FORANEAS'
from  
(
  select  count(distinct NumTar) as contar
  from ATM_TRANe with (nolock)
  where Fecha>='2014-01-01'
    AND Fecha<='2014-01-31'
    and NetDestino!=0
    and SystemCodResp=0
  group by NetDestino
)dt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.