Подсчет Oracle 11г - PullRequest
       0

Подсчет Oracle 11г

0 голосов
/ 27 марта 2020

весь день я борюсь с oracle упражнениями и снова застрял. Мне нужно выбрать фамилии боксеров с их победами в каждой весовой категории.

Итак, у меня есть:

  • таблица «боксер» со столбцами: id, fname, lname, weight
  • таблица «бой» с двумя внешними ключами из таблицы boxer (id_boxer1 и id_boxer2) и с одним победителем в столбце (если boxer1 выиграл, то победитель будет номером 1, если boxer2 выиграл, тогда победитель будет номером 2)
  • таблица «category_weight» со столбцами: id, min_weight, max_weight, имя (категории)

Пример:

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');

Боксер с идентификатором «1» выиграл два бои в категории1, поэтому результат должен быть:

Lname          Category       Wins
Johnny         category1      2

1 Ответ

0 голосов
/ 27 марта 2020

Вот, попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...