简体   繁体   English

在 Oracle 11g 中计数

[英]Counting in Oracle 11g

all day I am struggling with oracle exrcises and again I stuck.我整天都在与 oracle exrcise 斗争,我又一次陷入困境。 I need to select last names of boxers with their wins of each weight category.我需要选择拳击手在每个体重类别中获胜的姓氏。

So I have:所以我有:

  • table "boxer" with columns: id, fname, lname, weight带有列的表“拳击手”:id、fname、lname、weight
  • table "fight" with two foreign keys from table boxer (id_boxer1 and id_boxer2) and with one column winner (if boxer1 won then winner will be number 1, if boxer2 won then winner will be number 2)表“战斗”与来自表 boxer(id_boxer1 和 id_boxer2)的两个外键和一个列获胜者(如果 boxer1 获胜则获胜者将是 1 号,如果 boxer2 获胜则获胜者将是 2 号)
  • table "category_weight" with columns: id, min_weight, max_weight, name (of a category)表“category_weight”与列:id,min_weight,max_weight,名称(类别)

Example:例子:

CREATE TABLE category_weight(
    id    INTEGER NOT NULL,
    min_weight          SMALLINT NOT NULL,
    max_weight          SMALLINT NOT NULL,
    name  VARCHAR2(20) NOT NULL
);

ALTER TABLE category_weight ADD CONSTRAINT category_weight_pk PRIMARY KEY ( id );

CREATE TABLE boxer(
    id  INTEGER NOT NULL,
    fname       VARCHAR2(20) NOT NULL,
    lname      VARCHAR2(20) NOT NULL,
    weight     INTEGER NOT NULL
);

ALTER TABLE boxer ADD CONSTRAINT boxer_pk PRIMARY KEY ( id );

CREATE TABLE fight(
    id       INTEGER NOT NULL,
    winner SMALLINT NOT NULL,
    id_category_weight  INTEGER NOT NULL,
    id_boxer1     INTEGER NOT NULL,
    id_boxer2     INTEGER NOT NULL
);

ALTER TABLE fight ADD CONSTRAINT fight_pk PRIMARY KEY ( id );

ALTER TABLE fight
    ADD CONSTRAINT boxer_fk FOREIGN KEY ( id_boxer1 )
        REFERENCES boxer ( id );

ALTER TABLE fight
    ADD CONSTRAINT boxer_fk2 FOREIGN KEY ( id_boxer2 )
        REFERENCES boxer ( id );

ALTER TABLE fight
    ADD CONSTRAINT categ_weight_fk FOREIGN KEY ( id_category_weight )
        REFERENCES category_weight ( id );

INSERT INTO boxer
VALUES ('1', 'Johnny','Johnny','60');
INSERT INTO boxer
VALUES ('2', 'Anthonny','Anthonny','54');
INSERT INTO boxer
VALUES ('3', 'Anonimm','Anonimm','59');
INSERT INTO boxer
VALUES ('4', 'John','Johnowski','71');

INSERT INTO category_weight
VALUES ('1', '1','70','category1');
INSERT INTO category_weight
VALUES ('2', '71','100','category2');

INSERT INTO fight
VALUES ('1','1','1','1','2');
INSERT INTO fight
VALUES ('2','2','1','3','1');

Boxer with ID "1" won two fights in category1, so the result should be: ID 为“1”的拳击手在类别 1 中赢得了两场比赛,所以结果应该是:

Lname          Category       Wins
Johnny         category1      2

Here, try this:来,试试这个:

SELECT b.lname, 
       cw.max_weight AS WEIGHT_CLASS,
       COUNT(CASE WHEN f.winner = b.id THEN 1 ELSE NULL END) AS WINS
FROM boxer b
INNER JOIN fight f ON b.id = f.id_boxer1 OR b.id = f.id_boxer2
INNER JOIN category_weight cw ON f.id_category_weight = cw.id
GROUP BY b.lname, cw.max_weight

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM