---
# System prepended metadata

title: BD Lista 1

---

# 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


```


```