# BD Lista 1
https://dataedo.com/samples/html/AdventureWorks/doc/AdventureWorks_2/tables/Sales_SalesOrderHeader_185.html
NOtatki
Po WHEREmusimy napisac wszystkiw relacjie które zachodzą pomiędzy dopytywanymi przez nas tabelami
### Zad 1
```sql=
SELECT DISTINCT City --wybierz bez powtorzen
FROM SalesLT.Address, SalesLT.SalesOrderHeader
WHERE SalesLT.Address.AddressID = SalesLT.SalesOrderHeader.ShipToAddressID
AND SalesLT.SalesOrderHeader.Status = 5
ORDER BY SalesLT.Address.City
```
### Zad 2
```sql=
SELECT SalesLT.ProductModel.Name, COUNT(SalesLT.Product.ProductID)
FROM SalesLT.ProductModel, SalesLT.Product
WHERE SalesLT.ProductModel.ProductModelID = SalesLT.Product.ProductModelID
GROUP BY SalesLT.ProductModel.ProductModelID, SalesLT.ProductModel.Name
HAVING COUNT(SalesLT.Product.ProductID) > 1
```
nazwa jako wartość grupująca -> duplikaty nazw o różnych id -> problem
## Zad 3
```sql=
SELECT
SalesLT.Address.City,
COUNT(DISTINCT SalesLT.Customer.CustomerID), --sumuje takie same
COUNT(DISTINCT SalesLT.Customer.SalesPerson)
FROM SalesLT.CustomerAddress
LEFT JOIN SalesLT.Address ON SalesLT.Address.AddressID = SalesLT.CustomerAddress.AddressID
LEFT JOIN SalesLT.Customer ON SalesLT.Customer.CustomerID = SalesLT.CustomerAddress.CustomerID
GROUP BY SalesLt.Address.City
```
## Zad 4
Proste
```sql=
UPDATE SalesLT.Product
SET ProductCategoryID = 1
WHERE SalesLT.Product.ProductID = 680
SELECT SalesLT.ProductCategory.Name, SalesLT.Product.Name, SalesLT.Product.ProductCategoryID
FROM SalesLT.Product
LEFT JOIN SalesLT.ProductCategory on SalesLT.ProductCategory.ProductCategoryID = SalesLT.Product.ProductCategoryID
WHERE SalesLT.Product.ProductCategoryID
NOT IN (
SELECT ProductCategoryID FROM SalesLT.ProductCategory
WHERE SalesLT.ProductCategory.ProductCategoryID NOT IN (
SELECT DISTINCT ParentProductCategoryID FROM SalesLT.ProductCategory WHERE ParentProductCategoryID IS NOT NULL)
)
```
### Zad 5
```sql=
SELECT
FirstName,
LastName,
SUM(SalesLT.SalesOrderDetail.OrderQty*SalesLT.SalesOrderDetail.UnitPriceDiscount) as "Discounts"
FROM SalesLT.Customer
JOIN SalesLT.SalesOrderHeader ON SalesLT.SalesOrderHeader.CustomerID = SalesLT.Customer.CustomerID
JOIN SalesLT.SalesOrderDetail ON SalesLT.SalesOrderDetail.SalesOrderID = SalesLT.SalesOrderHeader.SalesOrderID
GROUP BY SalesLT.Customer.CustomerID, SalesLT.Customer.LastName, SalesLT.Customer.FirstName
```
SalesOrderDetail.OrderQty to ile się sprzedało
### Zad 6
```
```
### Zad 7
@@IDENTITY -> ostatnio wygenerowany numer w ramach sesji
SCOPE_IDENTITY -> obecny zakres w ramach sesji
IDENT_CURRENT -> ostatnio wygenerowany numer w ramach WSZYSTKICH sesji i zasięgów (czyli np. robimy 2 połączenia i to zwróci z ostatniego)
```sql
IF OBJECT_ID('Test', 'U') IS NOT NULL
DROP TABLE Test;
CREATE TABLE Test
(
id_gen int IDENTITY(1000, 10),
val int
);
INSERT INTO TEST
VALUES (1), (2), (3), (4), (5)
--jeżeli tu by było jakies dodanie do bazy to dwie następne linijki by sie roznily
SELECT @@IDENTITY
SELECT IDENT_CURRENT('Test')
DROP TABLE Test
```
Pamiętaj żeby te selecty robić po koleji
### Zad 8
```sql=
pierwsza proba
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME='CK_SalesOrderHeader_ShipDate'
ale tam nie ma tylko się dowiedziałem że to jest jakis check
wiec znalazlem ze jest jeszcze cos wiecej
SELECT name, definition
FROM sys.check_constraints AS s
WHERE s.name = 'CK_SalesOrderHeader_ShipDate'
Dodanie złego inputu
INSERT INTO SalesLT.SalesOrderHeader(OrderDate, DueDate, ShipDate, Comment, CustomerID, ShipMethod)
VALUES
('2022-01-01 00:00:00.000', '2023-01-01 00:00:00.000', '2019-01-01 00:00:00.000', 'wrongval', 30072, 'CARGO TRANSPORT 5')
wyłączenie constraint
ALTER TABLE SalesLT.SalesOrderHeader NOCHECK CONSTRAINT CK_SalesOrderHeader_ShipDate
i przeszło skopiuj to na początek
teraz to wyłączyc
ALTER TABLE SalesLT.SalesOrderHeader CHECK CONSTRAINT CK_SalesOrderHeader_ShipDate
i sprawdzić niezgodności
```
btw wyłączenie wszystkich
ALTER TABLE SalesLT.SalesOrderHeader NOCHECK CONSTRAINT ALL
## Zad 9
```sql=
-- add column
ALTER TABLE SalesLT.Customer
ADD CreditCardNumber VARCHAR(10)
-- dodanie informacji
UPDATE SalesLT.SalesOrderHeader
SET CreditCardApprovalCode = 0000
WHERE SalesLT.SalesOrderHeader.SalesOrderID = 71774
UPDATE SalesLT.SalesOrderHeader
SET CreditCardApprovalCode = 1111
WHERE SalesLT.SalesOrderHeader.SalesOrderID = 71776
UPDATE SalesLT.SalesOrderHeader
SET CreditCardApprovalCode = 2222
WHERE SalesLT.SalesOrderHeader.SalesOrderID = 71780
--znalezioenie customersow ktorym zmienilem kod
SELECT CustomerID FROM SalesLT.SalesOrderHeader AS s
WHERE s.SalesOrderID = 71774 OR s.SalesOrderID = 71776 OR s.SalesOrderID = 71780
-- dodanie x w odpowiednie miejsce
UPDATE SalesLT.Customer
SET CreditCardNumber = 'X'
WHERE exists (
SELECT CustomerID FROM SalesLT.SalesOrderHeader
WHERE (SalesLT.SalesOrderHeader.SalesOrderID = 71774 OR SalesLT.SalesOrderHeader.SalesOrderID = 71776 OR SalesLT.SalesOrderHeader.SalesOrderID = 71780) AND SalesLT.Customer.CustomerID = SalesLT.SalesOrderHeader.CustomerId
)
chyba to lepsze
UPDATE SalesLT.Customer
SET CreditCardNumber = 'X'
WHERE exists (
SELECT CustomerID FROM SalesLT.SalesOrderHeader AS s
WHERE s.CreditCardApprovalCode IS NOT NULL AND SalesLT.Customer.CustomerID = s.CustomerId
)
-- sprawdzenie czy sie udalo
SELECT *
FROM SalesLT.Customer
WHERE CreditCardNumber = 'X'
posprzatanie po sobie
ALTER TABLE SalesLT.Customer
DROP COLUMN CreditCardNumber;
```
### Zad 10
tez robialne
```
```