दिलचस्प पोस्ट
पिक्चरबॉक्स PaintEvent अन्य विधि के साथ SimpleDateFormat और लोकेल आधारित प्रारूप स्ट्रिंग Google स्प्रैडशीट: जब कोई कक्ष पाठ को बदलता है रो रंग का रंग बदलने के लिए स्क्रिप्ट; सीरियल वीरियोनयूआईडी क्या है और मुझे इसका उपयोग क्यों करना चाहिए? जावा में परिपत्र संदर्भ छवि-नक्शे और छवियों को गतिशील रूप से रीसाइज़ करना मेल को नेटवर्क क्रैडेन्शियल के रूप में प्रेषण के रूप में सही रूप में कार्य नहीं करता सी # शानदार तरीका यह जांचने के लिए कि संपत्ति की संपत्ति शून्य है के लिए जावास्क्रिप्ट … में बनाम के लिए 3 अलग बराबर है आकार की वापसी 0 (शून्य) कर सकते हैं CodeIgniter – कैसे डीबी त्रुटियों को पकड़ने के लिए? कोणीय 2 घटक निर्माता बनाम OnInit पी ग्राफिक्स के कई पृष्ठों और एकाधिक पीडीएफ़ को आर ग्राफिक्स कैसे मुद्रित करें? रूबी आई ++ या आई- (वेतन वृद्धि / घटते ऑपरेटरों) का समर्थन क्यों नहीं करता है?

एसक्यूएल में, आप श्रेणियों में "समूह" कैसे कर सकते हैं?

मान लीजिए मेरे पास एक संख्यात्मक कॉलम वाला टेबल है (इसे "स्कोर" कहते हैं)।

मैं गणनाओं की एक तालिका तैयार करना चाहता हूं, जो यह दर्शाता है कि प्रत्येक श्रेणी में कितनी बार स्कोर दिखाई देते हैं

उदाहरण के लिए:

 स्कोर श्रेणी |  घटनाओं की संख्या
 -------------------------------------
    0-9 |  1 1
   10-19 |  14
   20-29 |  3
    ... |  ...

इस उदाहरण में 10 से 1 9 की श्रेणी में अंकों के साथ 0 से 9, 14 पंक्तियों की रेंज और 11 से 20 रेंज के स्कोर वाले 3 पंक्तियों के साथ 11 पंक्तियां थीं।

क्या यह सेट करने का एक आसान तरीका है? आप क्या सलाह देते हैं?

वेब के समाधान से एकत्रित समाधान "एसक्यूएल में, आप श्रेणियों में "समूह" कैसे कर सकते हैं?"

SQLServer 2000 पर उच्चतर मतदान किए गए उत्तरों में से कोई भी सही नहीं है। शायद वे किसी भिन्न संस्करण का उपयोग कर रहे थे।

यहां SQLServer 2000 पर उन दोनों के सही संस्करण दिए गए हैं

select t.range as [score range], count(*) as [number of occurences] from ( select case when score between 0 and 9 then ' 0- 9' when score between 10 and 19 then '10-19' else '20-99' end as range from scores) t group by t.range 

या

 select t.range as [score range], count(*) as [number of occurences] from ( select user_id, case when score >= 0 and score< 10 then '0-9' when score >= 10 and score< 20 then '10-19' else '20-99' end as range from scores) t group by t.range 

मुझे यहां जवाब मिलते हैं जो SQL सर्वर के वाक्यविन्यास में काम नहीं करेगा I मै इस्तेमाल करूंगा:

 select t.range as [score range], count(*) as [number of occurences] from ( select case when score between 0 and 9 then ' 0-9 ' when score between 10 and 19 then '10-19' when score between 20 and 29 then '20-29' ... else '90-99' end as range from scores) t group by t.range 

संपादित करें: टिप्पणियां देखें

एक वैकल्पिक दृष्टिकोण में क्वेरी में उन्हें एम्बेड करने के बजाय किसी तालिका में श्रेणियां संग्रहीत करना शामिल होगा। आप एक तालिका के साथ समाप्त होगा, इसे कॉल करें श्रेणी, जो इस तरह दिखता है:

 LowerLimit UpperLimit Range 0 9 '0-9' 10 19 '10-19' 20 29 '20-29' 30 39 '30-39' 

और एक ऐसा प्रश्न जो इस तरह दिखता है:

 Select Range as [Score Range], Count(*) as [Number of Occurences] from Ranges r inner join Scores s on s.Score between r.LowerLimit and r.UpperLimit group by Range 

इसका मतलब तालिका तैयार करना है, लेकिन वांछित श्रेणियों में परिवर्तन होने पर इसे बनाए रखना आसान होगा। कोई कोड परिवर्तन आवश्यक नहीं है!

पोस्टग्रेज़ में (जहां || स्ट्रिंग कन्सेटैनेशन ऑपरेटर है):

 select (score/10)*10 || '-' || (score/10)*10+9 as scorerange, count(*) from scores group by score/10 order by 1 

देता है:

  scorerange | count ------------+------- 0-9 | 11 10-19 | 14 20-29 | 3 30-39 | 2 

जेम्स Curran का जवाब मेरी राय में सबसे संक्षिप्त था, लेकिन उत्पादन सही नहीं था। SQL सर्वर के लिए सरलतम कथन निम्नानुसार है:

 SELECT [score range] = CAST((Score/10)*10 AS VARCHAR) + ' - ' + CAST((Score/10)*10+9 AS VARCHAR), [number of occurrences] = COUNT(*) FROM #Scores GROUP BY Score/10 ORDER BY Score/10 

यह एक # स्कॉरेज़ अस्थायी तालिका का परीक्षण करता है जो मैं इसे परीक्षण करता था, मैंने 100 और 0 और 99 के बीच यादृच्छिक संख्या के साथ पंक्तियों का आराध्य किया था।

 create table scores ( user_id int, score int ) select t.range as [score range], count(*) as [number of occurences] from ( select user_id, case when score >= 0 and score < 10 then '0-9' case when score >= 10 and score < 20 then '10-19' ... else '90-99' as range from scores) t group by t.range 
 select cast(score/10 as varchar) + '-' + cast(score/10+9 as varchar), count(*) from scores group by score/10 

मैं इसे थोड़ा अलग तरीके से कर दूंगा ताकि प्रत्येक मामले को परिभाषित किए बिना यह तराजू हो:

 select t.range as [score range], count(*) as [number of occurences] from ( select FLOOR(score/10) as range from scores) t group by t.range 

जांच नहीं की, लेकिन आपको यह विचार मिलता है …

यह आपको सीमाओं को निर्दिष्ट करने की अनुमति नहीं देगा, और SQL सर्वर अज्ञेयवादी होना चाहिए। मठ FTW!

 SELECT CONCAT(range,'-',range+9), COUNT(range) FROM ( SELECT score - (score % 10) as range FROM scores ) 
 declare @RangeWidth int set @RangeWidth = 10 select Floor(Score/@RangeWidth) as LowerBound, Floor(Score/@RangeWidth)+@RangeWidth as UpperBound, Count(*) From ScoreTable group by Floor(Score/@RangeWidth) 

चूंकि स्तंभ को क्रमबद्ध ( Range ) पर एक स्ट्रिंग है, इसलिए संख्यात्मक सॉर्टिंग के बजाय स्ट्रिंग / शब्द सॉर्टिंग का उपयोग किया जाता है

जब तक स्ट्रिंग्स की लंबाई शून्य से पैड के लिए शून्य होती है, तब तक सॉर्टिंग अभी भी सही तरीके से सही होनी चाहिए:

 SELECT t.range AS ScoreRange, COUNT(*) AS NumberOfOccurrences FROM (SELECT CASE WHEN score BETWEEN 0 AND 9 THEN '00-09' WHEN score BETWEEN 10 AND 19 THEN '10-19' ELSE '20-99' END AS Range FROM Scores) t GROUP BY t.Range 

यदि श्रेणी मिश्रित होती है, तो बस एक अतिरिक्त शून्य पैड करें:

 SELECT t.range AS ScoreRange, COUNT(*) AS NumberOfOccurrences FROM (SELECT CASE WHEN score BETWEEN 0 AND 9 THEN '000-009' WHEN score BETWEEN 10 AND 19 THEN '010-019' WHEN score BETWEEN 20 AND 99 THEN '020-099' ELSE '100-999' END AS Range FROM Scores) t GROUP BY t.Range 

प्रयत्न

 SELECT (str(range) + "-" + str(range + 9) ) AS [Score range], COUNT(score) AS [number of occurances] FROM (SELECT score, int(score / 10 ) * 10 AS range FROM scoredata ) GROUP BY range; 
 select t.blah as [score range], count(*) as [number of occurences] from ( select case when score between 0 and 9 then ' 0-9 ' when score between 10 and 19 then '10-19' when score between 20 and 29 then '20-29' ... else '90-99' end as blah from scores) t group by t.blah 

यदि आप MySQL में हैं तो सुनिश्चित करें कि आप 'श्रेणी' के अलावा किसी अन्य शब्द का उपयोग करते हैं, या आपको ऊपर दिए गए उदाहरण को चलाने के लिए त्रुटि मिल जाएगी।

शायद आप ऐसी चीजों को रखने के बारे में पूछ रहे हैं …

बेशक आप प्रश्नों के लिए एक पूर्ण तालिका स्कैन डालेंगे और यदि तालिका जिसमें स्कोर की आवश्यकता होती है (एग्रीग्रेशन) बड़ी होती है, तो आप बेहतर प्रदर्शन समाधान चाहते हैं, तो आप एक द्वितीयक तालिका बना सकते हैं और नियमों का उपयोग कर सकते हैं, जैसे कि on insert – आप इसे देख सकते हैं

सभी RDBMS इंजन के नियम नहीं हैं, हालांकि!