web-dev-qa-db-ja.com

最初の文字でグループ化

Oracle SQLのクエリに問題があります。

employeesテーブルにfirst_name列があります。 first_nameの最初の文字に従ってレコードをグループ化したい。

たとえば、26個のレコードがあり、1つはname = 'Alice'で、1つはname = 'Bob'で、以下同様に各名前の最初の文字のアルファベット順に並べます。クエリの後、26人のグループがあり、それぞれに1人の従業員がいます。

私は以下を試しましたが、うまくいきません:

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  
33
sonu

EMPLOYEE_IDを機能させるには、EMPLOYEE_IDに対していくつかの集計関数を実行する必要があるため、クエリは間違っています。

お気に入り:

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

正確に何を達成しようとしていますか?

57

集約関数ではないすべてのものでグループ化する必要があるため、SELECTプロジェクションにemployee_idを含めることはできません。また、first_nameの最初の文字だけでグループ化する必要があります。このようなものはうまくいくはずです:

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

これは、名の最初の文字でグループ化し、そのグループに属する従業員の数を示します。

8
yukondude

最初の列としてA、B、Cを含む26個のレコードを返し、2番目の列にはすべての従業員IDが区切られたリストで含まれているように思われます。その場合は、質問468990および/または this Ask Tom link を参照してください。のような(試されていない)

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);
2
Alistair Knock

Rails/postgresでは次のようになります

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

私は同様の問題を抱えており、これをステートメントで解決しました:

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

output

1
user3418801

グループ化する場合、選択リストに表示される集計されないすべての列は、「group by」句にも表示される必要があります(employee_idは表示されません)。

何をしようとしているのか明確にしていただけませんか?

1
Joe Suarez

私はあなたが何をしようとしているのか知っていると思います...

列 'letter'(letter、sort_order)を持つ小さな参照テーブルを作成する必要があります

あなたはあなたのクエリとして

l.letterを選択し、l(letter = count)の従業員としてcount(e.id)左外部結合従業員eのl.letter = substr(e.first_name、1,1)

投稿された他の回答は、名前に特定の文字が含まれている従業員がいない場合に予期しない結果になります...

0
mson