Versuchen Sie nicht, eine Kolumne pro Tag zu erstellen; Erstellen Sie einfach eine Tabelle mit Spalten für Ort, Datum und für jede Statistik (z. B. infiziert, wiederhergestellt, tot usw.) und wenn Sie sie dann drehen müssen, tun Sie dies in einer Abfrage (oder in einer anderen Anwendung der mittleren Ebene [z. B. PHP, Java, .net], mit dem Sie auf die Datenbank zugreifen).
Etwas wie:
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 )
);
Anschließend können Sie Ihre Daten eingeben. Die Regionen wären beispielsweise:
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;
Und die ersten 3 Datenspalten wären:
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;
Wenn Sie es dann als Spalten pro Tag ausgeben möchten, verwenden Sie einen 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"
)
)
Welche Ausgaben:
db<>fiddle hier