2009-03-20 15 views
24

मुझे ओरेकल एसक्यूएल में एक क्वेरी के साथ समस्या है।पहले चरित्र द्वारा समूह

मेरे पास employees तालिका में first_name कॉलम है। मैं अपने रिकॉर्ड को first_name में पहले वर्ण के अनुसार समूहित करना चाहता हूं।

उदाहरण के लिए, मेरे पास 26 रिकॉर्ड हैं, name = 'Alice' के साथ, name = 'Bob' के साथ, और प्रत्येक नाम के पहले वर्ण के लिए वर्णमाला नीचे। पूछताछ के बाद, प्रत्येक कर्मचारी के साथ 26 समूह होना चाहिए।

मैं निम्नलिखित की कोशिश की, लेकिन यह काम नहीं कर रहा:

SELECT employee_id, (SUBSTR(first_name,1,1)) AS alpha FROM employees 
GROUP BY alpha; 

name_which_starts_from  employees 
A       10 
B       2 
C       4 
D       9 
E       3 
G       3 
H       3 
I       2 
J       16 
K       7 
L       6 
M       6 
N       4 
O       1 
P       6 
R       3 
S       13 
T       4 
V       2 
W       3 
+1

SQL सेवा के लिए एक समान प्रश्न के लिए निम्न लिंक देखें er: http://stackoverflow.com/questions/13500638/sql-how-many-records-start-with-the-same-letter –

उत्तर

52

आपकी क्वेरी गलत है, जब से तुम अगर आप काम करने के लिए चाहता हूँ कि EMPLOYEE_ID पर कुछ एकत्रीकरण समारोह में प्रदर्शन करने की आवश्यकता होगी।

तरह:

select substr(first_name,1,1) as alpha, count(employee_id) 
    from employees 
group by substr(first_name,1,1) 

कि वास्तव में आप क्या हासिल करने की कोशिश कर रहे हैं?

+1

आपने मुझे इसे निष्पक्ष और वर्ग में हरा दिया। लगभग समान क्वेरी भी। – yukondude

+1

हेहेहेहे ... याहू। मैंने आपको वैसे भी वोट दिया ;-) –

+0

आपको बहुत धन्यवाद। मुझे अपना परिणाम मिला .. क्या आप बहुत –

6

आपको एक समग्र कार्य नहीं करने वाली सभी चीज़ों से समूह करना होगा, इसलिए आपके पास SELECT प्रक्षेपण में कर्मचारी_आईडी नहीं हो सकती है। आपको पहले_नाम के पहले अक्षर द्वारा समूहबद्ध करने की भी आवश्यकता है। कुछ इस तरह काम करना चाहिए:

SELECT SUBSTR(first_name, 1, 1) AS alpha, COUNT(*) AS employee_count 
FROM employees 
GROUP BY SUBSTR(first_name, 1, 1); 

यह पहला नाम के पहले अक्षर से समूह होगा, और कहा कि कि समूह में आते हैं कर्मचारियों की संख्या दिखाते हैं।

1

जब आप समूह कर रहे हैं, तो आपके चयन सूची में दिखाई देने वाले सभी कॉलम को "समूह द्वारा" खंड (कर्मचारी_आईडी नहीं) में भी दिखाई देना होगा।

क्या आप यह स्पष्ट कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?

0

मुझे लगता है कि मुझे पता है तुम क्या करने कोशिश कर रहे हैं ...

आप एक स्तंभ 'पत्र' (पत्र, SORT_ORDER)

के साथ एक छोटे संदर्भ तालिका बनाना चाहिए तुम चाहिए

के रूप में आपकी क्वेरी

चयन l.letter, वर्ण l से कर्मचारियों के रूप में (e.id) गिनती बाईं बाहरी l.letter = substr पर कर्मचारी ई में शामिल होने के (e.first_name, 1,1)

अन्य उत्तर पोस्ट दे देंगे आप अप्रत्याशित नतीजे जब उनके नाम में कोई विशिष्ट पत्र वाला कोई कर्मचारी नहीं है ...

+0

आपको बहुत बहुत धन्यवाद। मुझे मेरा नतीजा मिला .. आप बहुत ज्यादा –

2

ऐसा लगता है कि आप चाहते हैं कि 26 रिकॉर्ड ए, बी, सी के साथ पहले कॉलम के रूप में लौटाए जाएं और फिर दूसरा कॉलम जिसमें सभी कर्मचारी आईडी हों एक सीमित सूची। यदि ऐसा है तो प्रश्न 4689 9 0 और/या this Ask Tom link देखें।जैसे (untested)

SELECT SUBSTR(first_name,1,1), TO_STRING(CAST(COLLECT(employee_id) AS ntt_varchar2)) AS empIDs 
FROM employees 
GROUP BY 
SUBSTR(first_name,1,1); 
+0

बहुत बहुत धन्यवाद। मुझे अपना परिणाम मिला .. आपको बहुत पसंद है –

0

रेल/postgres में कुछ ऐसा है जो इस

group_clause = 'UPPER(LEFT(name, 1))' 
Division.group(group_clause).order(group_clause).pluck(group_clause, 'COUNT(id)') 
0

की तरह कुछ लग सकता है मैं इसी तरह की समस्या आ रही है और यह इस हल बयान के साथ:

select SUBSTR(word, 1, 1) as S, count(word) FROM table_words group by S order by S ASC

output

संबंधित मुद्दे