2014-04-29 63 views
0

我是一名sql初學者,並試圖創建sql查詢以從下面我描述的這三個表中獲取數據。

「我需要顯示所有客戶端數大於1的聯繫人以及屬於他們的用戶,並最終按用戶進行分組。」

現在這是我試圖創建的SQL語句,但我有sqlplus的錯誤ORA-00933,SQL命令不能正確剛剛結束不久的「從客戶爲k」:用sql語句和聚合列計數合併三個表列(Oracle11G2)

SELECT COUNT(K .bkl),o.fnamek,o.lnamek,u.bu,u.fname,u.lname,k.namekl
from client AS k,contact AS o,usere AS u
where o.bko = k。 bko和o.bu = u.bu和count(k.bkl)> 1
group by u.bu;

CREATE TABLE Usere
(BU NUMBER(2)NOT NULL約束PK1 PRIMARY KEY,
FNAME VARCHAR2(20)NOT NULL,
L-NAME VARCHAR2(20)NOT NULL,
扇區VARCHAR2(20 )NOT NULL
);

CREATE TABLE聯繫
(BKO NUMBER(2)NOT NULL約束PK2 PRIMARY KEY,
fnamek VARCHAR2(20)NOT NULL,
lnamek VARCHAR2(20)NOT NULL,
BU NUMBER(2) DEFAULT 0 NOT NULL,
CONSTRAINT fk1 FOREIGN KEY(BU)REFERENCES Usere(bu)
);

CREATE TABLE客戶
(BKL NUMBER(3)NOT NULL約束PK3 PRIMARY KEY,
namekl VARCHAR2(20)NOT NULL,
地址VARCHAR(40)NOT NULL,
BKO NUMBER(2) DEFAULT 0 NOT NULL,
CONSTRAINT fk2 FOREIGN KEY(bko)參考資料聯繫人(bko)
);

任何人都可以幫忙嗎?非常感謝你。

回答

0

對於表別名,Oracle不允許在from子句中使用as。另外,

  • 您應該學會使用正確的連接語法。
  • 您需要在group by中包含所有非聚合列。
  • 對聚合條件(如count())進行過濾屬於having子句。

    select count(k.bkl), o.fnamek, o.lnamek, u.bu, u.fname, u.lname, k.namekl 
    from client k join 
        contact o 
        on o.bko = k.bko join 
        usere u 
        on o.bu = u.bu 
    group by o.fnamek, o.lnamek, u.bu, u.fname, u.lname, k.namekl 
    having count(k.bk1) > 1; 
    
+0

非常感謝您的回覆,我知道我需要學習很多東西,正如我所說,我在甲骨文掌握的開始階段。 你好,我試圖實現你的查詢,我得到「現在行選擇」作爲輸出。 我已經檢查過,並且在桌面客戶端中肯定有多於一個客戶端的聯繫人。 例如,「從bko = 10的客戶端中選擇bkl」將返回該特定聯繫人下的3個客戶端名稱? – user3586784

+0

@ user3586784。 。 。那麼,刪除'having'子句,你會看到列的組合是唯一的。 –

+0

有沒有辦法像排序視圖一樣顯示已計數的客戶數量,而不是重複他們分配給每個客戶的聯繫人?謝謝。 – user3586784

0

這是SQL查詢,我一直在尋找,我已經設法弄明白:

select count(k.bkl) as Client_Number, o.fnamek as Contact_Name, 
o.lnamek as Contact_Lastname, u.bu as User_ID, 
u.fname as User_Name, u.lname User_Lastname 
from client k join 
kontakt o 
on o.bko = k.bko join 
usere u 
on o.bu = u.bu 
group by o.fnamek, o.lnamek, u.bu, u.fname, u.lname 
having count(k.bkl) > 1 

與第一代碼的主要問題是,列k.namekl作爲客戶端的名稱不能在聚合SQL語句計數(k.bkl)中。我試圖計算客戶端大於1的字段,並同時顯示這些客戶端的名稱。非常感謝Gordon的幫助。

0

也許這查詢將幫助您:

select * from 
(
select count(k.bkl) over (partition by u.bu) bk1# , 
     o.fnamek, o.lnamek, u.bu, u.fname, u.lname, k.namekl 
from client k, contact o, usere u 
where o.bko = k.bko and o.bu = u.bu 
) 
where bk1#>1