40

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

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

たとえば、26 個のレコードがあり、1 つはname = 'Alice'、もう 1 つはname = 'Bob'、というように、各名前の最初の文字のアルファベットが続きます。クエリの後、それぞれ 1 人の従業員を持つ 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  
4

7 に答える 7

69

EMPLOYEE_ID で集計関数を実行する必要があるため、クエリは間違っています。

お気に入り:

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

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

于 2009-03-20T15:03:28.840 に答える
12

集計関数ではないすべてのものでグループ化する必要があるため、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);

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

于 2009-03-20T15:05:37.477 に答える
7

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

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

出力

于 2016-01-28T06:43:04.630 に答える
2

A、B、C を最初の列として 26 のレコードを返し、次にすべての従業員 ID を区切られたリストに含む 2 番目の列を返す必要があるように思えます。その場合は、質問 468990 および/またはこの Ask Tom リンクを参照してください。のようなもの(未テスト)

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);
于 2009-03-20T15:12:17.057 に答える
1

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

あなたがやろうとしていることを明確にしていただけますか?

于 2009-03-20T15:08:47.860 に答える
0

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

列「文字」(文字、並べ替え順序)を持つ小さな参照テーブルを作成する必要があります

次のようにクエリする必要があります

select l.letter, count(e.id) as employees from letter l left outer join employee e on l.letter = substr(e.first_name, 1,1)

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

于 2009-03-20T15:11:23.907 に答える