---------------Creating
tables for Database--------------
create table Supplier (
SupplierID INT IDENTITY(200,1) Primary Key,
SName VARCHAR(35),
SEmail VARCHAR(50),
SContactFName VARCHAR(20),
SContactLName VARCHAR(20),
SContactPhone VARCHAR(20),
SNotes VARCHAR(MAX),
SAddress VARCHAR(35),
SWebsite VARCHAR(60));
create table Item (
ItemSN VARCHAR(25) Primary Key,
ItemName VARCHAR(35),
ItemDesc VARCHAR(400),
ItemPrice Decimal(8,2),
ItemWeight Decimal(8,2));
create table SupplierItem (
SupplierID INT references
Supplier(SupplierID),
ItemSN VARCHAR(25) references Item(ItemSN));
create table InvLocation (
LocID INT Primary Key,
LAisle VARCHAR(10),
LColumn VARCHAR(15),
LHeight VARCHAR(10));
create table Inventory (
InvtID INT IDENTITY(1000,1) Primary Key,
Quantity INT,
DateIN DATETIME,
DateOUT DATETIME,
ItemSN VARCHAR(25) references Item(ItemSN),
LocID INT references
InvLocation(LocID));
---------------Inserting
DATA into TABLES-------------------
------------------CREATE
TABLEs for DataWarehouse-------------------
CREATE Table dwItems(
ItemSN VARCHAR(25) Primary key,
IName VARCHAR(35),
IPrice DECIMAL(8,2),
IWeight DECIMAL(8,2),
QUANTITY INT,
DateID INT,
SupID INT,
InvtID INT
);
create table dwSupplier (
dwSup INT IDENTITY (1,1) Primary Key,
SupID INT,
SName VARCHAR(35),
SContact VARCHAR(45),
SPhone VARCHAR(20),
IName VARCHAR(35)
);
Create Table dwInvOUT (
InvtID INT Primary Key,
IName VARCHAR(35),
Quantity INT,
DateOUT DAtETIME
);
CREATE TABLE dwInventoryDates (
DateID INT IDENTITY(1,1) PRIMARY KEY,
RawDate DATE,
Day_of_Week VARCHAR(9),
Month_of_Year VARCHAR(9),
Quarter_of_Year VARCHAR(2),
Inv_Year INT
);
------------------MAKE
DATES for date table-------------------------
create proc dwMakeDates
@vStartDate DATE
as
declare
@vCounter INT =
1;
SET NOCOUNT ON;
While
@vCounter <= 1000
BEGIN
INSERT into dwInventoryDates
values (@vStartDate, DATENAME(weekday,@vStartDate), DATENAME(MONTH, @vStartDate), CONCAT(DATEPART(QUARTER,
@vStartDate), 'Q'), DATEPART(Year,@vStartDate));
Set
@vCounter = @vCounter+1;
Set
@vStartDate = DATEADD(day,1,@vStartDate);
END;
Exec
dwMakeDates @vStartDate = '11/2/2015';
select *
from
dwInventoryDates
------------------Get
DWSupplier FACTS------------------------------
create proc dwGetSupFacts
as
begin
insert into dwSupplier
select
s.SupplierID, s.SName, CONCAT(s.SContactFName, ' ', s.SContactLName), s.SContactPhone, i.ItemName
from
Supplier s join SupplierItem si on s.SupplierID = si.SupplierID
join
item i on si.ItemSN
= i.ItemSN
end
------------------Get
DWITem FACTS----------------------------------
create proc dwGetItemFacts
as
begin
insert into dwItems
select
i.ItemSN, i.ItemName, i.ItemPrice, i.ItemWeight, inv.Quantity, DATEDIFF(dd,'11/1/2015',inv.DateIN), s.SupplierID, inv.InvtID
from
item I join Inventory inv on I.ItemSN = inv.ItemSN
join
SupplierItem si on si.ItemSN
= i.ItemSN
join
Supplier s on si.SupplierID
= s.SupplierID
end
exec
dwGetItemFacts;
--****************Total
Quantity in Inventory per QUARTER***********
select dwd.Quarter_of_Year, SUM(dwi.QUANTITY) as 'Total Quantity in
Inventory'
from
dwItems dwi join dwInventoryDates dwd on dwi.DateID = dwd.DateID
group by dwd.Quarter_of_Year
order by 2 desc;
------------------Get
ITEM name from SN-----------------------------
create function GetItemName
(@vItemSN
VARCHAR(25))
RETURNS VARCHAR(35)
as
begin
declare
@vItemName VARCHAR(35);
select
@vItemName = ItemName
from Item
where
ItemSN = @vItemSN;
return
@vItemName;
end
------------------Get
Inventory going out on Given month/year-------
create proc InvOUTupdate
(@vMonthNum
INT,
@vYear INT)
as
declare
@vInvtID INT,
@vIName VARCHAR(35),
@vQuantity INT,
@vDateOUT DATETIME;
Delete from dwInvOUT
where datepart(Year,DateOUT) = @vYear and datepart(Month,DateOUT) = @vMonthNum;
declare
MonthsInventory CURSOR for
select Distinct InvtID
from
Inventory
where DATEPART(Month,DateOUT) = @vMonthNum and datepart(Year,DateOUT) = @vYear;
OPEN
MonthsInventory
FETCH NEXT FROM
MonthsInventory into @vInvtID
While @@FETCH_STATUS = 0
begin
select
@vIName = dbo.GetItemName(ItemSN), @vQuantity = Quantity, @vDateOUT
= DateOUT
from
Inventory
where
InvtID = @vInvtID;
Insert into dwInvOUT
values
(@vInvtID,
@vIName, @vQuantity,
@vDateOUT);
FETCH NEXT FROM
MonthsInventory INTO @vInvtID
end
SET NOCOUNT OFF;
CLOSE
MonthsInventory;
DEALLOCATE
MonthsInventory;
Exec
InvOUTupdate @vMonthNum = 2, @vYear = 2017;
select *
from
dwInvOUT
order by 4;
------------------Trigger
to prevent Inventory delete and update to Item table to re-order Item
create trigger Qupdate on
Inventory
instead of delete
as
begin
declare
@vIntID int;
select
@vIntID = deleted.InvtID
from
deleted;
update
Inventory
set
Quantity = 0
where
InvtID = @vIntID;
update
Item
set
ItemDesc = 'Need to
RE-Order'
where
ItemSN like
(select ItemSN from
Inventory where InvtID =
@vIntID)
end;
delete from Inventory
where
InvtID = 1049;
select
InvtID, Quantity,
it.ItemName, it.ItemDesc
from
Inventory i join item it on i.ItemSN = it.ItemSN
where i.InvtID = 1049;
select *
from
Item
-----------------------------------------------
select *
from
Airports
drop table LongHauls
create table LongHauls (
Flight_ID INT Primary key,
City_Origin VARCHAR(25),
City_Destination VARCHAR(25),
Flight_Time_Minutes INT
);
---------Get
airport Origin Name from Airport Code
create function GetOrigin
(@vCOrigin
VARCHAR(3))
RETURNS VARCHAR(25)
as
begin
Declare
@vAirLoca VARCHAR(25);
select
@vAirLoca = Airport_Location
from
Airports
where
Airport_Code = @vCOrigin;
Return
@vAirLoca;
End
---------Get
airport Destination Name from Airport Code
create function GetDest
(@vCDest
VARCHAR(3))
RETURNS VARCHAR(25)
as
begin
Declare
@vAirLoca VARCHAR(25);
select
@vAirLoca = Airport_Location
from
Airports
where
Airport_Code = @vCDest;
Return
@vAirLoca;
End
----------------CURSOR-----
select DATEDIFF(MINUTE,
Departure_DateTime, Arrival_DateTime) as TotalMin
from
Flights
order by 1 desc
drop proc LongFlights
create proc LongFlights
as
declare
@vFlightID INT,
@vCityOri VARCHAR(25),
@vCityDes VARCHAR(25),
@vTotalMin INT;
declare
LongHualFlights CURSOR for
Select
Flight_ID
from
Flights
where DATEDIFF(MINUTE,
Departure_DateTime, Arrival_DateTime) >= 200;
OPEN
LongHualFlights
FETCH NEXT FROM
LongHualFlights INTO @vFlightID
WHILE @@FETCH_STATUS = 0
begin
select
@vCityOri = dbo.GetOrigin(Airport_Code_Origin),
@vCityDes = dbo.GetDest(Airport_Code_Destination),
@vTotalMin = DATEDIFF(MINUTE, Departure_DateTime,
Arrival_DateTime)
from
Flights
where
Flight_ID = @vFlightID;
Insert into LongHauls
values
(@vFlightID,
@vCityOri, @vCityDes,
@vTotalMin);
FETCH NEXT FROM
LongHualFlights INTO @vFLightID
END
SET NOCOUNT OFF;
CLOSE
LongHualFlights;
DEAllOCATE
LongHualFlights;
exec
LongFlights;
------------------------------------------
select *
from
LongHauls
create table dwBookFacts (
ISBN VARCHAR(14),
SellerID INT,
DateID INT,
TotalSales Decimal(8,2),
TotalVolumessold INT
);
select *
from
BookSales
CREATE PROC dwGetBookSales
@vSaleDate DATE
AS
BEGIN
insert into dwBookFacts
select
ISBN, SellerID,
DATEDIFF(dd,'9/30/2016',SaleDate), SUM (SalePrice), COUNT(ISBN)
from
BookSales
where
SaleDate = @vSaleDate
group
by ISBN,
SellerID, DATEDIFF(dd,'9/30/2016',SaleDate);
END
Exec
dwGetBookSales @vSaleDate = '11/1/2016';
select *
from
dwBookFacts;
insert into BookSales
values
('978-0439064873', 200, '11/1/2016', 9.27),
('978-0439064873', 200, '11/1/2016', 9.27),
('978-0439064873', 100, '11/1/2016', 9.27);
drop table dwSalesDates
CREATE TABLE dwSalesDates (
DateID INT IDENTITY(1,1) PRIMARY KEY,
RawDate DATE,
Day_of_Week VARCHAR(9),
Month_of_Year VARCHAR(9),
Quarter_of_Year VARCHAR(2),
Sales_Year INT
);
Drop proc dwMakeDates
create proc dwMakeDates
@vStartDate DATE
as
declare
@vCounter INT =
1;
SET NOCOUNT ON;
While
@vCounter <= 1000
BEGIN
INSERT into dwSalesDates
values (@vStartDate, DATENAME(weekday,@vStartDate), DATENAME(MONTH, @vStartDate), CONCAT(DATEPART(QUARTER,
@vStartDate), 'Q'), DATEPART(Year,@vStartDate));
Set
@vCounter = @vCounter+1;
Set
@vStartDate = DATEADD(day,1,@vStartDate);
END;
Exec
dwMakeDates @vStartDate = '10/1/2016';
select *
from
dwSalesDates;
select d.Quarter_of_Year, Sum(f.TotalSales) as 'Total Sales'
from
dwBookFacts f join dwSalesDates d on f.DateID = d.DateID
group by d.Quarter_of_Year
order by 2 desc;
create function getAuthors
(@vISBN
VARCHAR(14))
RETURNS VARCHAR(420)
AS
BEGIN
Declare
@vCurAuthor VARCHAR(41) = '',
@vAuthorList VARCHAR(420) = '',
@vAuthorCount INT,
@vCounter INT
= 1;
Select
@vAuthorCount = COUNT(AID)
from
BookAuthors
where
ISBN = @vISBN;
if
@vAuthorCount = 0
set
@vAuthorList = 'No
Author found for this title'
else if @vAuthorCount = 1
Select
@vAuthorList = CONCAT(a.AFName, ' ', a.LFName)
from
Author a join BookAuthors ba on a.AID = ba.AID
where
ba.ISBN =
@vISBN;
else
While
@vCounter <= @vAuthorCount
begin
Select
@vCurAuthor = MIN(CONCAT(a.AFName, ' ', a.LFName))
from
Author a join BookAuthors ba on a.AID = ba.AID
where
ba.ISBN =
@vISBN and CONCAT(a.AFName, ' ', a.LFName) > @vCurAuthor;
IF
@vCounter = 1
Set @vAuthorList =
@vCurAuthor;
Else
Set @vAuthorList =
@vAuthorList+ ', '
+ @vCurAuthor;
Set
@vCounter = @vCounter+1;
END
RETURN
@vAuthorList;
END;
Select *
from
Books
select
BookTitle, dbo.getAuthors(ISBN) from Books
where
ISBN = '978-0470135921';
select *, dbo.getAuthors(ISBN) from dwBookFacts;
create table dwAuthorList (
ISBN VARCHAR(14) Primary key,
AuthorList VARCHAR(420),
BookTitle
VARCHAR(60)
);
drop proc popAuthors
create proc popAuthors
as
Begin
delete from dwAuthorList;
insert into dwAuthorList
select
ISBN, dbo.getAuthors(ISBN), BookTitle
from
Books;
End
exec
popAuthors;
select *
from
dwAuthorList;
--------Learning
how to make Cursors *#@$% ----------------
create table dwSalesVolumes (
ISBN VARCHAR(14) primary key,
BookTitle VARCHAR(60),
SalesTot DECIMAL(12,2),
VolumeTot INT
);
create function GetTitle
(@vISBN
VARCHAR(14))
RETURNS VARCHAR(60)
As
Begin
Declare
@vTitle VARCHAR(60);
select
@vTitle = BookTitle
from
Books
where
ISBN = @vISBN;
Return
@vTitle;
END
create proc UpdateSalesData
(@vSalesDate DATE)
as
--SET
NOCOUNT ON;
Declare
@vISBN VARCHAR(14),
@vBookTitle VARCHAR(60),
@vSalesTot DECIMAL(12,2),
@vVolumeTot INT;
Declare
curSalesVol CURSOR FOR
Select Distinct ISBN
from
BookSales
where
SaleDate = @vSalesDate;
OPEN
curSalesVol
FETCH NEXT FROM curSalesVol
INTO @vISBN
WHILE @@FETCH_STATUS = 0
BEGIN
Select
@vBookTitle = dbo.GetTitle(ISBN), @vSalesTot = SUM(SalePrice),
@vVolumeTot = Count(SaleID)
from
BookSales
where
ISBN = @vISBN
group by dbo.GetTitle(ISBN);
Delete from dwSalesVolumes where
ISBN = @vISBN;
INSERT INTO dwSalesVolumes
values (@vISBN, @vBookTitle, @vSalesTot,
@vVolumeTot);
FETCH NEXT FROM curSalesVol
INTO @vISBN
END
SET NOCOUNT OFF;
CLOSE
curSalesVol;
DEALLOCATE
curSalesVol;
exec
UpdateSalesData @vSalesDate = '10/12/2016';
select * from dwSalesVolumes;