Как я могу разбить строки в SQL Server по дате?
Бонусная болтовня
В SQL Server относительно легко разбить таблицы на год , например ::
- стол
Orders_2000
- таблица
Orders_2001
- стол
Orders_2002
- ...
- стол
Orders_2011
- стол
Orders_2012
Вы создаете отдельную таблицу для каждого года, обязательно добавляя столбец Year
с проверочным ограничением, соответствующим таблице:
CREATE TABLE Transactions_1999 (Year int NOT NULL DEFAULT 1999, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_1999 ADD CONSTRAINT PK_Transactions1999 PRIMARY KEY CLUSTERED (Year, TransactionID)
ALTER TABLE Transactions_1999 ADD CONSTRAINT CK_Transactions1999_Year CHECK (Year = '1999')
CREATE TABLE Transactions_2000 (Year int NOT NULL DEFAULT 2000, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2000 ADD CONSTRAINT PK_Transactions2000 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2000 ADD CONSTRAINT CK_Transactions2000_Year CHECK (Year = '2000')
CREATE TABLE Transactions_2001 (Year int NOT NULL DEFAULT 2001, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2001 ADD CONSTRAINT PK_Transactions2001 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2001 ADD CONSTRAINT CK_Transactions2001_Year CHECK (Year = '2001')
...
CREATE TABLE Transactions_2011 (year int NOT NULL DEFAULT 2011, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2011 ADD CONSTRAINT PK_Transactions2011 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2011 ADD CONSTRAINT CK_Transactions2011_Year CHECK (Year = '2011')
CREATE TABLE Transactions_2012 (Year int NOT NULL DEFAULT 2012, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2012 ADD CONSTRAINT PK_Transactions2012 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2012 ADD CONSTRAINT CK_Transactions2012_Year CHECK (Year = '2012')
Затем вы можете создать VIEW
, который объединится в таблицы:
CREATE VIEW Transactions AS
SELECT * FROM Transactions_1999
UNION ALL
SELECT * FROM Transactions_2000
UNION ALL
SELECT * FROM Transactions_2001
UNION ALL
--...
SELECT * FROM Transactions_2011
UNION ALL
SELECT * FROM Transactions_2012
А теперь вы можете запросить это Transactions
представление:
SELECT * FROM Transactions
WHERE (CustomerName LIKE 'boyd%')
OR (CustomerName LIKE '% boyd%')
И данные могут быть вставлены в представление, и SQL Server автоматически поместит их в таблицу, в которую они должны войти:
INSERT INTO Transactions(Year, TransactionID, CustomerName)
VALUES (2012, 378922384, 'Ian Boyd')
Но это не то, что я хочу
я хочу разбить данные на таблицы по возраст . Строки с TransactionDate
старше 90 дней должны входить в одну таблицу, а транзакции с TransactionDate
не более 90 дней - в другую таблицу:
- стол
Transactions_olderThan90Days
- стол
Transactions_newerThan90Days
Так говорит SQL:
CREATE TABLE Transactions_NewerThan90Days (
TransactionDate datetime NOT NULL,
TransactionID int NOT NULL,
CustomeName varchar(50))
CREATE TABLE Transactions_OlderThan90Days (
TransactionDate datetime NOT NULL,
TransactionID int NOT NULL,
CustomeName varchar(50))
Возможна ли такая вещь в SQL Server?
Я понимаю, что это звучит невозможно, поскольку это означает, что SQL Server приходится постоянно перемещать данные.