2014-04-29 4 views
0

Je suis un débutant à sql et essayait de créer une requête SQL pour obtenir des données de ces trois tables ci-dessous que j'ai décrites.

"J'ai besoin de montrer tous les Contacts qui ont un nombre de clients supérieur à 1 et les utilisateurs qui leur appartiennent, et enfin de les regrouper par utilisateurs."

Maintenant, c'est STATEMENT sql que je cherchais à créer, mais je vais avoir erreur sqlplus ORA-00933, commande SQL pas correctement terminée juste à côté "du client comme k":Fusionner trois colonnes de tables avec l'instruction SQL et le nombre de colonnes agrégées (Oracle11G2)

select count (k .bkl), o.fnamek, o.lnamek, u.bu, u.fname, u.lname, k.namekl
du client AS k, contactez AS o, usere AS u
où o.bko = k. bko et o.bu = u.bu et compte (k.bkl)> 1
groupe par u.bu;

CREATE TABLE Usere
(bu NUMÉRO (2) NON CONTRAINTES NULL PK1 clé primaire,
FNAME VARCHAR2 (20) NOT NULL,
lname VARCHAR2 (20) NOT NULL,
secteur VARCHAR2 (20) NOT NULL
);

CREATE TABLE Contactez
(BKO NUMÉRO (2) NON CONTRAINTES NULL PQ2 clé primaire,
fnamek VARCHAR2 (20) NOT NULL,
lnamek VARCHAR2 (20) NOT NULL,
bu NUMÉRO (2) PAR DÉFAUT 0 NON NULL,
CONTRAINTE fk1 CLÉ ÉTRANGÈRE (bu) RÉFÉRENCES Usere (bu)
);

CREATE TABLE client
(BKL NUMÉRO (3) NOT NULL PK3 clé primaire,
namekl VARCHAR2 (20) NOT NULL,
adresse VARCHAR (40) NOT NULL,
NUMÉRO BKO (2) DEFAUT 0 NON NULL,
CONTRAINTE fk2 TOUCHE ETRANGERE (bko) REFERENCES Contact (bko)
);

Quelqu'un peut-il aider? Merci beaucoup.

Répondre

0

Oracle n'autorise pas as dans la clause from pour les alias de table. Plus,

  • Vous devez apprendre à utiliser la syntaxe de jointure appropriée.
  • Vous devez inclure toutes les colonnes non agrégées dans group by.
  • Le filtrage sur les conditions d'agrégation (telles que count()) appartient à la clause 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

Merci beaucoup pour votre réponse, je suis conscient que je dois apprendre beaucoup, comme je l'ai dit que je suis aux premières étapes de la maîtrise d'Oracle. Bonjour, j'ai essayé d'implémenter votre requête, et j'obtiens "maintenant les lignes sélectionnées" en sortie. J'ai vérifié et il y a certainement des contacts avec plus d'un client dans un client de table. Par exemple "select bkl du client où bko = 10" renvoie 3 noms de client sous ce contact particulier? – user3586784

+0

@ utilisateur3586784. . . Eh bien, supprimez la clause 'having' et vous verrez que la combinaison de colonnes est unique. –

+0

Y at-il de toute façon une vue triée pour afficher le nombre de clients comptés et ne pas répéter le contact sous chaque client auquel ils ont été affectés? Merci. – user3586784

0

C'est la requête SQL, je cherchais, et je l'ai réussi à le comprendre:

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 

problème principal avec le premier code était cette colonne k.namekl comme le nom du client ne peut pas être compris dans le décompte global des instructions sql (k.bkl). J'essayais de compter les champs où les clients sont plus grands que 1 et en même temps montrer le nom de ces clients. Merci beaucoup Gordon pour votre aide.

0

Peut-être que cette requête vous aidera à:

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 
Questions connexes