44
Grupowanie wielowymiarowe w MS SQL Przykładowe dane

Grupowanie wielowymiarowe w MS SQL

  • Upload
    melita

  • View
    44

  • Download
    0

Embed Size (px)

DESCRIPTION

Grupowanie wielowymiarowe w MS SQL. Przykładowe dane. Tworzymy widok. USE [buczek] GO /****** Object: View [dbo].[Sprzedaz] Script Date: 11/25/2007 11:32:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [dbo].[Sprzedaz] AS - PowerPoint PPT Presentation

Citation preview

Page 1: Grupowanie wielowymiarowe w MS SQL

Grupowanie wielowymiarowe w MS SQL Przykładowe dane

Page 2: Grupowanie wielowymiarowe w MS SQL
Page 3: Grupowanie wielowymiarowe w MS SQL

Tworzymy widok

Page 4: Grupowanie wielowymiarowe w MS SQL

USE [buczek]GO/****** Object: View [dbo].[Sprzedaz] Script Date: 11/25/2007 11:32:07 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE VIEW [dbo].[Sprzedaz]ASSELECT dbo.ds_Asortymenty.NazwaAsortymentu, dbo.tch_ListaProduktow.Wymiar, dbo.ds_klienci.Nazwa, dbo.ha_Zamowienie.DataZamowienia, dbo.ha_ZamLinie.IloscFROM dbo.ds_klienci INNER JOIN dbo.ha_Zamowienie ON dbo.ds_klienci.Id = dbo.ha_Zamowienie.IdKlienta INNER JOIN dbo.ha_ZamLinie ON dbo.ha_Zamowienie.IdZamowienie = dbo.ha_ZamLinie.IdZamowienie INNER JOIN dbo.ds_Asortymenty INNER JOIN dbo.tch_ListaProduktow ON dbo.ds_Asortymenty.IdAsortymentu = dbo.tch_ListaProduktow.IdAsortymentu ON dbo.ha_ZamLinie.IdProduktu = dbo.tch_ListaProduktow.IdProduktu

GO

Page 5: Grupowanie wielowymiarowe w MS SQL
Page 6: Grupowanie wielowymiarowe w MS SQL

SELECT NazwaAsortymentu, Nazwa, SUM(Ilosc) AS RazemFROM dbo.SprzedazGROUP BY NazwaAsortymentu, NazwaORDER BY NazwaAsortymentu

Page 7: Grupowanie wielowymiarowe w MS SQL

SELECT NazwaAsortymentu, Nazwa, SUM(Ilosc) AS RazemFROM SprzedazGROUP BY NazwaAsortymentu, Nazwa WITH CUBE

Page 8: Grupowanie wielowymiarowe w MS SQL

Zastępowanie wartości null

Funkcja GROUPING zwraca 1 jeśli wartość null jest wynikiem działania operatora CUBE klauzuli GROUP BY i 0 jeśli null jest wynikiem braku danych

Funkcja ISNULL zastępuje null podaną wartością

Page 9: Grupowanie wielowymiarowe w MS SQL

SELECT CASE WHEN (GROUPING(NazwaAsortymentu) = 1) THEN 'Razem' ELSE ISNULL(NazwaAsortymentu, 'Nieznana') END AS Asortyment, CASE WHEN (GROUPING(Nazwa) = 1) THEN 'Razem' ELSE ISNULL(Nazwa, ‘Nieznana') END AS Firma, SUM(Ilosc) AS IloscRazemFROM dbo.SprzedazGROUP BY NazwaAsortymentu, Nazwa WITH CUBE

Page 10: Grupowanie wielowymiarowe w MS SQL

Podsumowania jednowymiarowe

Page 11: Grupowanie wielowymiarowe w MS SQL

SELECT CASE WHEN (GROUPING(NazwaAsortymentu) = 1) THEN 'Razem' ELSE ISNULL(NazwaAsortymentu, 'Nieznana') END AS Asortyment, SUM(Ilosc) AS IloscRazemFROM dbo.SprzedazGROUP BY NazwaAsortymentu WITH CUBE

Page 12: Grupowanie wielowymiarowe w MS SQL

Perspektywa umożliwia dowolne przeglądanie podsumowań

Page 13: Grupowanie wielowymiarowe w MS SQL

USE [buczek]GO/****** Object: View [dbo].[SprzedazCube3] Script Date: 11/27/2007 15:45:27 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE VIEW [dbo].[SprzedazCube4]ASSELECT CASE WHEN (GROUPING(NazwaAsortymentu) = 1) THEN 'Razem' ELSE ISNULL(NazwaAsortymentu, ' Nieznana ') END AS Asortyment, CASE WHEN (GROUPING(Nazwa) = 1) THEN 'Razem' ELSE ISNULL(Nazwa, ' Nieznana ') END AS Firma, SUM(Ilosc) AS IloscRazemFROM dbo.SprzedazGROUP BY NazwaAsortymentu, Nazwa WITH CUBE

GO

Page 14: Grupowanie wielowymiarowe w MS SQL

SELECT Asortyment, IloscRazem, FirmaFROM dbo.SprzedazCube4WHERE (Asortyment = 'A-Rura z/s aluminiowana gładka') AND (Firma = 'Razem')

Page 15: Grupowanie wielowymiarowe w MS SQL

Transact - SQL

Pracochłonne zapytania np. aktualizujące dane można zastąpić procedurami składowanymi

Page 16: Grupowanie wielowymiarowe w MS SQL

use buczekSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO

CREATE PROCEDURE Dopisywanie

@Nazwa char(255), @KodPocztowy char(255),@Miejscowosc char(255)

ASBEGIN

insert into ds_klienci (Nazwa, KodPocztowy, Miejscowosc) values (@Nazwa, @KodPocztowy, @Miejscowosc)ENDGO

Page 17: Grupowanie wielowymiarowe w MS SQL

dopisywanie 'Firma A', '30-150', 'Kraków'

Page 18: Grupowanie wielowymiarowe w MS SQL
Page 19: Grupowanie wielowymiarowe w MS SQL

Kursor

Kursor jest tabelą rekordów umożliwiającą dostęp do kolekcji pobranej z tabeli lub złożenia

Page 20: Grupowanie wielowymiarowe w MS SQL

USE buczekGO-- Execute the SELECT statement alone to show the -- full result set that is used by the cursor.SELECT Nazwa, Miejscowosc FROM ds_klienciORDER BY Nazwa-- Declare the cursor.DECLARE kursor SCROLL CURSOR FORSELECT Nazwa, Miejscowosc FROM ds_klienciORDER BY NazwaOPEN kursor-- Fetch the last row in the cursor.FETCH LAST FROM kursor-- Fetch the row immediately prior to the current row in the cursor.FETCH PRIOR FROM kursor

Page 21: Grupowanie wielowymiarowe w MS SQL
Page 22: Grupowanie wielowymiarowe w MS SQL

-- Fetch the second row in the cursor.FETCH ABSOLUTE 2 FROM kursor-- Fetch the row that is three rows after the current row.FETCH RELATIVE 3 FROM kursor-- Fetch the row that is two rows prior to the current row.FETCH RELATIVE -2 FROM kursorCLOSE kursorDEALLOCATE kursorGO

Page 23: Grupowanie wielowymiarowe w MS SQL
Page 24: Grupowanie wielowymiarowe w MS SQL

Wykorzystanie kursora

SELECT DataZamowienia, SUM(DISTINCT Ilosc) AS razemFROM SprzedazGROUP BY DataZamowieniaORDER BY DataZamowienia

Page 25: Grupowanie wielowymiarowe w MS SQL

USE buczekGODECLARE @Il real, @Poprzedni real, @Dynamika realDECLARE kursor CURSOR FORSELECT SUM(DISTINCT Ilosc) AS razemFROM SprzedazGROUP BY DataZamowieniaORDER BY DataZamowieniaOPEN kursorFETCH NEXT FROM kursorINTO @PoprzedniWHILE @@FETCH_STATUS = 0BEGIN FETCH NEXT FROM kursor INTO @Il PRINT @Il PRINT @Poprzedni PRINT @Il/@Poprzedni SET @Poprzedni=@IlEND

Page 26: Grupowanie wielowymiarowe w MS SQL
Page 27: Grupowanie wielowymiarowe w MS SQL

Dopisywanie rekordów i identyfikacja klucza

Page 28: Grupowanie wielowymiarowe w MS SQL

USE [Test]GO/****** Object: StoredProcedure [dbo].[InsertZamowienie] Script Date: 11/27/2007 18:58:44 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[InsertZamowienie] @Klient char(255), @Data datetime, @Identity bigint ASDECLARE @IdKlienta bigintSELECT @IdKlienta = IdKlienta FROM KlienciWHERE Nazwa = @KlientINSERT INTO Zamowienia (Data, IdKlienta) VALUES(@Data, @IdKlienta)SET @Identity = SCOPE_IDENTITY()Print @Identity

Page 29: Grupowanie wielowymiarowe w MS SQL

Uruchomienie procedurySET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE Test ASDECLARE @indeks bigintbeginexec InsertZamowienie 'Firma AS', '2007-11-30', @indeksPRINT @indeksend

Page 30: Grupowanie wielowymiarowe w MS SQL
Page 31: Grupowanie wielowymiarowe w MS SQL

Przykład

Fabryka rur stalowych produkuje rury z kręgów blachy stalowej w następujących operacjach– rozcięcie kręgu (coil cut)– perforowanie (perforating) – tylko dla rur perforowanych– zgrzewanie

Zamówienia składają się z wielu linii Dla każdej wprowadzonej linii należy opracować

kartę technologiczną (Product card)

Page 32: Grupowanie wielowymiarowe w MS SQL

Wyzwalacze

W tabeli OrderLine po wpisaniu nowego zamówienia automatycznie uzupełniamy pole Status wartością „1”

Page 33: Grupowanie wielowymiarowe w MS SQL
Page 34: Grupowanie wielowymiarowe w MS SQL
Page 35: Grupowanie wielowymiarowe w MS SQL

po opuszczeniu linii:

Page 36: Grupowanie wielowymiarowe w MS SQL

„Uzbrajanie” linii zamówienia

Każda linia zawiera identyfikator produktu finalnego

Opis wszystkich faz procesu zapisany jest w tabeli ProductionPlan, przy czym IdStock jest identyfkatorem półproduktu opisanego w tabeli Product

Ze względu na iterację nie można wygenerować opisu technologii dla linii zamówienia przy pomocy prostego zapytania SQL

Page 37: Grupowanie wielowymiarowe w MS SQL

Diagram i zawartość linii zamówień

Page 38: Grupowanie wielowymiarowe w MS SQL

Diagram powiązań opisu technologii

Page 39: Grupowanie wielowymiarowe w MS SQL

Wykorzystanie Transact-SQL

Język Transact-SQL wprowadza elementy języków proceduralnych takich jak pętla, warunek logiczny, zmienna pamięciowa

Przykładowa procedura odszukuje w tabeli ProductionPlan wiersz dla operacji, której wynikiem jest wyrób gotowy a następnie w pętli szuka kolejnych półproduktów aż do chwili gdy zapytanie SELECT nie zmienia wartości indeksu półproduktu (@adress1)

Page 40: Grupowanie wielowymiarowe w MS SQL

declare @adress bigint, @adress1 bigint, @stock real, @yield realSELECT TOP 1 @adress1=ProductionPlan.IdStock,@adress=OrderLine.IdProduct,

@stock=OrderLine. Quantity, @yield=ProductionPlan.YieldFROM OrderLine INNER JOIN Product ON OrderLine.IdProduct = Product.IdProduct INNER JOIN ProductionPlan ON Product.IdProduct = ProductionPlan.IdProduct WHERE orderline.status=1print 'Ordered product Id:'Print @adressprint 'First semiproduct Id:'print @adress1print 'Yield:'print @yieldset @stock=@stock/@yieldprint 'Stock for first operation:'print @stockwhile @adress1 <> @adressbegin

set @adress=@adress1SELECT @adress1=ProductionPlan.IdStockFROM ProductionPlanWHERE ProductionPlan.IdProduct=@adressSELECT @yield=ProductionPlan.YieldFROM ProductionPlan WHERE ProductionPlan.IdProduct=@adressif @adress1<> @adress begin

set @stock=@stock/@yieldprint 'Next semiproduct Id:'print @adress1print 'Yield:'print @yieldprint 'Stock for next operation:'print @stock

endend

Page 41: Grupowanie wielowymiarowe w MS SQL

Ordered product Id:43First semiproduct Id:999Yield:0.95Stock for first operation:62.1053Next semiproduct Id:937Yield:0.9Stock for next operation:69.0059Next semiproduct Id:1781Yield:1Stock for next operation:69.0059

Page 42: Grupowanie wielowymiarowe w MS SQL

Tworzenie karty technologicznej

Do tabeli ProductCard dopisywane są kolejne rekordy opisujące operacje w ciągu technologicznym

Page 43: Grupowanie wielowymiarowe w MS SQL

declare @adress bigint, @adress1 bigint, @orderid bigint, @stock real, @yield real,@operation bigint,@tool bigint,@unit bigint, @productivity real

SELECT TOP 1 @adress1=ProductionPlan.IdStock,@adress=OrderLine.IdProduct, @stock=OrderLine. Quantity, @yield=ProductionPlan.Yield,@orderid=OrderLine.IdOrderLine, @operation=ProductionPlan.IdOperation,@tool=ProductionPlan.IdTool, @unit=ProductionPlan.IdUnit,@productivity=ProductionPlan.Productivity

FROM OrderLine INNER JOIN Product ON OrderLine.IdProduct = Product.IdProduct INNER JOIN ProductionPlan ON Product.IdProduct = ProductionPlan.IdProduct WHERE orderline.status=1INSERT INTO ProductCard (IdOrderLine, IdOperation,IdTool,IdUnit,Productivity,Yield,IdStock)VALUES (@orderid, @operation, @tool, @unit, @productivity, @yield, @adress1)set @stock=@stock/@yieldwhile @adress1 <> @adressbegin

set @adress=@adress1SELECT @adress1=ProductionPlan.IdStock, @yield=ProductionPlan.Yield,

@operation=ProductionPlan.IdOperation,@tool=ProductionPlan.IdTool, @unit=ProductionPlan.IdUnit,@productivity=ProductionPlan.Productivity

FROM ProductionPlan WHERE ProductionPlan.IdProduct=@adressif @adress1<> @adress begin

INSERT INTO ProductCard (IdOrderLine, IdOperation,IdTool,IdUnit,Productivity,Yield,IdStock)

VALUES (@orderid, @operation, @tool, @unit, @productivity, @yield, @adress1)

set @stock=@stock/@yieldend

end

Page 44: Grupowanie wielowymiarowe w MS SQL