Как создать увеличивающиеся столбцы? - PullRequest
1 голос
/ 23 марта 2020

У меня есть таблица с этими именами столбцов.

Province/State
Country/Region
Lat
Long
1/22/20
1/23/20
1/24/20
1/25/20
...
...
3/21/20

Я знаю, как создать первые 4 столбца, но я не знаю, как создать столбец даты и увеличить его.

Как я могу реализовать такое количество столбцов одновременно?
Спасибо!

Заражено

enter image description here

Мертвый

enter image description here

Восстановленный

enter image description here

Созданная мной реляционная модель данных объекта

enter image description here

Вопрос -: Отправить работу Oracle скрипт для вашей схемы базы данных.

1 Ответ

3 голосов
/ 24 марта 2020

Не пытайтесь создавать столбец в день; просто создайте таблицу со столбцами для местоположения, даты и для каждой статистики c (то есть зараженных, выздоровевших, мертвых и т. д. c.), а затем, если вам нужно их повернуть, сделайте это в запросе (или в любом среднем приложение уровня [т.е. PHP, Java, .net], которое вы используете для доступа к базе данных).

Что-то вроде:

CREATE TABLE Regions(
  id        VARCHAR2(6)
            CONSTRAINT regions__id__pk PRIMARY KEY,
  parent_id VARCHAR2(6)
            CONSTRAINT regions_parent__fk REFERENCES Regions ( id ),
  name      VARCHAR2(50)
            CONSTRAINT regions__name__nn NOT NULL
            CONSTRAINT regions__name__u UNIQUE,
  latitude  NUMBER
            CONSTRAINT regions__lat__nn NOT NULL,
  longitude NUMBER
            CONSTRAINT regions__long__nn NOT NULL,
  CONSTRAINT regions__id__chk CHECK (
       ( parent_id IS     NULL AND REGEXP_LIKE( id, '^[A-Z]{2}$' ) )
    OR ( parent_id IS NOT NULL AND REGEXP_LIKE( id, '^[A-Z]{2}-[A-Z0-9]{1,3}$' ) )
  )
);
COMMENT ON COLUMN Regions.id        IS 'ISO 3166-2 Alpha-2 Country Code or ISO 3166-2 Province Code';
COMMENT ON COLUMN Regions.name      IS 'ISO 3166-2 English Short Name.';
COMMENT ON COLUMN Regions.latitude  IS 'Latitude of the region''s main city.';
COMMENT ON COLUMN Regions.longitude IS 'Longitude of the region''s main city.';

CREATE TABLE Virus_Statistics(
  id        NUMBER(20,0)
            GENERATED ALWAYS AS IDENTITY
            CONSTRAINT virus_statistics__id__pk PRIMARY KEY,
  location  VARCHAR2(6)
            CONSTRAINT virus_statistics__loc__nn NOT NULL
            CONSTRAINT virus_statistics__loc__fk REFERENCES Regions ( id ),
  datetime  DATE
            CONSTRAINT virus_statistics__dt__nn NOT NULL
            CONSTRAINT virus_statistics__dt__chk CHECK ( datetime = TRUNC( datetime ) ),
  infected  NUMBER(10,0),
  recovered NUMBER(10,0),
  dead      NUMBER(10,0),
  CONSTRAINT virus_statistics__loc__dt__u UNIQUE ( location, datetime )
);

Затем вы можете ввести свои данные. Например, регионы будут:

INSERT INTO Regions ( id, parent_id, name, latitude, longitude )
SELECT 'TH',    NULL, 'Thailand',          15.00000,  101.00000 FROM DUAL UNION ALL
SELECT 'JP',    NULL, 'Japan',             36.00000,  138.00000 FROM DUAL UNION ALL
SELECT 'SG',    NULL, 'Singapore',          1.28333,  103.83333 FROM DUAL UNION ALL
SELECT 'NP',    NULL, 'Nepal',             28.16667,   84.25000 FROM DUAL UNION ALL
SELECT 'MY',    NULL, 'Malaysia',           2.50000,  112.50000 FROM DUAL UNION ALL
SELECT 'CA',    NULL, 'Canada',            45.42472, - 75.69500 FROM DUAL UNION ALL
SELECT 'CA-BC', 'CA', 'British Columbia',  48.40733, -123.32977 FROM DUAL;

И первые 3 столбца данных будут:

INSERT INTO Virus_Statistics ( location, datetime, infected, recovered, dead )
SELECT 'TH',    DATE '2020-01-22', 2 AS i, 0 AS r, 0 AS d FROM DUAL UNION ALL
SELECT 'TH',    DATE '2020-01-23', 3, 0, 0 FROM DUAL UNION ALL
SELECT 'TH',    DATE '2020-01-24', 5, 0, 0 FROM DUAL UNION ALL
SELECT 'JP',    DATE '2020-01-22', 2, 0, 0 FROM DUAL UNION ALL
SELECT 'JP',    DATE '2020-01-23', 1, 0, 0 FROM DUAL UNION ALL
SELECT 'JP',    DATE '2020-01-24', 2, 0, 0 FROM DUAL UNION ALL
SELECT 'SG',    DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'SG',    DATE '2020-01-23', 1, 0, 0 FROM DUAL UNION ALL
SELECT 'SG',    DATE '2020-01-24', 3, 0, 0 FROM DUAL UNION ALL
SELECT 'NP',    DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'NP',    DATE '2020-01-23', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'NP',    DATE '2020-01-24', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'MY',    DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'MY',    DATE '2020-01-23', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'MY',    DATE '2020-01-24', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'CA-BC', DATE '2020-01-22', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'CA-BC', DATE '2020-01-23', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'CA-BC', DATE '2020-01-24', 0, 0, 0 FROM DUAL;

Тогда, если вы хотите вывести его как столбцы в день, то используйте PIVOT:

SELECT *
FROM   (
  SELECT name,
         latitude,
         longitude,
         datetime,
         infected
  FROM   Virus_Statistics v
         INNER JOIN Regions r
         ON ( r.id = v.location )
)
PIVOT (
  MAX( infected )
  FOR datetime IN (
    DATE '2020-01-22' AS "2020-01-22",
    DATE '2020-01-23' AS "2020-01-23",
    DATE '2020-01-24' AS "2020-01-24"
  )
)

Какие выходы:

NAME             | LATITUDE |  LONGITUDE | 2020-01-22 | 2020-01-23 | 2020-01-24
:--------------- | -------: | ---------: | ---------: | ---------: | ---------:
Japan            |       36 |        138 |          2 |          1 |          2
Malaysia         |      2.5 |      112.5 |          0 |          0 |          0
Singapore        |  1.28333 |  103.83333 |          0 |          1 |          3
Nepal            | 28.16667 |      84.25 |          0 |          0 |          0
British Columbia | 48.40733 | -123.32977 |          0 |          0 |          0
Thailand         |       15 |        101 |          2 |          3 |          5

дБ <> скрипка здесь

...