SAP HANA'da Calculation Views: Graphical ve Script Views

SAP HANA, iş zekası ve veri analitiği için güçlü bir platform
sağlar. Veri modellenmesi, analitik ve raporlama gereksinimlerini karşılamak
için Calculation Views gibi araçlar sunar. Bu yazıda, SAP HANA'da Calculation
Views'leri anlamak ve kullanmak için önemli bilgileri sunacağız, özellikle de Graphical ve script tabanlı görünümler arasındaki farkları ele alacağız.
Calculation Views Nedir?
Calculation Views, SAP HANA'da veri modellenmesi için
kullanılan yapısal nesnelerdir. Temel olarak, bir veya daha fazla tablo, diğer
görünümler veya SQL ifadeleri üzerinde yapılan hesaplamaları ve işlemleri
temsil ederler. Bu, karmaşık iş gereksinimlerini karşılamak için veri
manipülasyonunu kolaylaştırır.
Calculation Views, Graphical ve script tabanlı
olmak üzere iki ana tipe ayrılabilir. Her birinin kendine özgü avantajları ve
kullanım senaryoları vardır.
Graphical Calculation Views
Graphical Calculation Views, SAP HANA Studio veya SAP HANA
Web IDE gibi araçlarla görsel bir arayüz kullanılarak oluşturulur. Bu,
geliştiricilerin iş gereksinimlerine uygun karmaşık veri modellerini hızla
oluşturmasını sağlar. Grafiksel arayüz, veri tabanlı yapıları sürükle-bırak
yöntemiyle kolayca tasarlamayı mümkün kılar.
Graphical Calculation Views avantajları
şunlardır:
Kullanımı kolaydır ve görsel olarak anlaşılabilir.
Veri modelleme sürecini hızlandırır.
Karmaşık sorguları ve hesaplamaları daha basit bir şekilde
ifade etmeyi sağlar.
Ancak, bazı durumlarda grafiksel arayüzün sınırlamaları
olabilir. Özellikle, daha karmaşık iş mantığı veya özelleştirilmiş hesaplama
gereksinimleri için script tabanlı görünümler daha uygundur.
Script Calculation Views
Script Calculation Views, SQL tabanlı bir betik dilini
kullanarak oluşturulur. Bu, geliştiricilere daha fazla esneklik ve kontrol
sağlar. Script tabanlı görünümler genellikle daha karmaşık iş mantığı
gerektiren senaryolar için tercih edilir. Geliştiriciler, SQL ifadeleri
ve programlama yapıları aracılığıyla daha fazla işlem yapabilir ve özelleştirme
yapabilirler.
Script Calculation Views avantajları şunlardır:
Daha fazla esneklik sağlar ve karmaşık iş mantığı
gereksinimlerini karşılar.
SQL tabanlı programlama dili kullanarak geniş bir işlevsellik
sunar.
Performans optimizasyonu ve özelleştirme imkanı sağlar.
Ancak, script tabanlı görünümler genellikle daha fazla teknik
bilgi gerektirir ve oluşturulması daha uzun sürebilir.
Hangi Görünümü Kullanmalısınız?
Graphical ve script tabanlı Calculation Views, farklı
gereksinimlere ve kullanım senaryolarına yöneliktir. Basit veri modelleri ve
hızlı prototipler oluşturmak istiyorsanız, Graphical görünümleri tercih
edebilirsiniz. Ancak, karmaşık iş mantığı veya özelleştirilmiş hesaplama
gereksinimleri söz konusu olduğunda, script tabanlı görünümler daha uygun
olabilir.
Kullanılacak görünüm tipini belirlerken, projenin
gereksinimlerini, zaman çerçevesini ve mevcut teknik becerileri dikkate almak
önemlidir. Genellikle, projenin karmaşıklığı arttıkça, script tabanlı
görünümler daha cazip hale gelir.
SAP HANA'da Calculation Views, veri modellenmesi ve analitik
işlemler için güçlü bir araç seti sunar. Graphical ve script tabanlı
görünümler, farklı gereksinimlere ve kullanım senaryolarına yöneliktir.
Graphical views, hızlı prototipler oluşturmak ve basit veri modellerini
yönetmek için idealdir, script tabanlı views ise daha karmaşık iş mantığı
gereksinimlerini karşılamak ve özelleştirmeler yapmak için uygundur. Her iki
türün avantajlarını ve dezavantajlarını dikkate alarak, projenizin gereksinimlerine
en uygun olanı seçebilirsiniz.
Örneklerle Script Calculation Views:
-- Satış Başlık
Tablosu
CREATE TABLE SalesHeader (
SalesOrderID VARCHAR(10) PRIMARY KEY,
CustomerID VARCHAR(10),
OrderDate DATE,
Status VARCHAR(20) -- İptal, İade, vs.
);
-- Satış Kalemi
Tablosu
CREATE TABLE SalesItem (
SalesOrderID VARCHAR(10),
ItemID INT,
ProductID VARCHAR(18),
Quantity DECIMAL(10, 2),
PRIMARY KEY (SalesOrderID, ItemID),
FOREIGN KEY (SalesOrderID) REFERENCES SalesHeader(SalesOrderID)
);
-- Teslimat Başlık
Tablosu
CREATE TABLE DeliveryHeader (
DeliveryID VARCHAR(10) PRIMARY KEY,
SalesOrderID VARCHAR(10),
DeliveryDate DATE,
Status VARCHAR(20) -- Teslim Edilmedi, Teslim Edildi, vs.
);
-- Teslimat
Kalemi Tablosu
CREATE TABLE DeliveryItem (
DeliveryID VARCHAR(10),
ItemID INT,
ProductID VARCHAR(18),
Quantity DECIMAL(10, 2),
PRIMARY KEY (DeliveryID, ItemID),
FOREIGN KEY (DeliveryID) REFERENCES DeliveryHeader(DeliveryID)
);
-- Fatura Başlık
Tablosu
CREATE TABLE InvoiceHeader (
InvoiceID VARCHAR(10) PRIMARY KEY,
SalesOrderID VARCHAR(10),
InvoiceDate DATE,
Status VARCHAR(20) -- İptal, İade, vs.
);
-- Fatura
Kalemi Tablosu
CREATE TABLE InvoiceItem (
InvoiceID VARCHAR(10),
ItemID INT,
ProductID VARCHAR(18),
Quantity DECIMAL(10, 2),
PRIMARY KEY (InvoiceID, ItemID),
FOREIGN KEY (InvoiceID) REFERENCES InvoiceHeader(InvoiceID)
);
-- Muhasebe Başlık
Tablosu
CREATE TABLE AccountingHeader (
AccountingDocumentID VARCHAR(10) PRIMARY KEY,
InvoiceID VARCHAR(10),
PostingDate DATE,
Status VARCHAR(20) -- İptal, İade, vs.
);
-- Muhasebe
Kalemi Tablosu
CREATE TABLE AccountingItem (
AccountingDocumentID VARCHAR(10),
ItemID INT,
AccountID VARCHAR(10),
Amount DECIMAL(15, 2),
PRIMARY KEY (AccountingDocumentID, ItemID),
FOREIGN KEY (AccountingDocumentID) REFERENCES AccountingHeader(AccountingDocumentID)
);
-- Örnek veri
ekleme
INSERT INTO SalesHeader (SalesOrderID, CustomerID, OrderDate, Status) VALUES
('SO001', 'C001', '2024-01-01', 'Aktif'),
('SO002', 'C002', '2024-01-02', 'İptal'),
('SO003', 'C003', '2024-01-03', 'Aktif'),
('SO004', 'C004', '2024-01-04', 'İade'),
('SO005', 'C005', '2024-01-05', 'Aktif'),
('SO006', 'C001', '2024-01-06', 'İptal'),
('SO007', 'C002', '2024-01-07', 'Aktif'),
('SO008', 'C003', '2024-01-08', 'İptal'),
('SO009', 'C004', '2024-01-09', 'Aktif'),
('SO010', 'C005', '2024-01-10', 'Aktif');
INSERT INTO SalesItem (SalesOrderID, ItemID, ProductID, Quantity) VALUES
('SO001', 1, 'P001', 100),
('SO001', 2, 'P002', 200),
('SO002', 1, 'P003', 150),
('SO003', 1, 'P004', 50),
('SO003', 2, 'P005', 75),
('SO004', 1, 'P006', 100),
('SO004', 2, 'P007', 125),
('SO005', 1, 'P008', 150),
('SO005', 2, 'P009', 175),
('SO006', 1, 'P010', 200),
('SO006', 2, 'P011', 225),
('SO007', 1, 'P012', 250),
('SO007', 2, 'P013', 275);
INSERT INTO DeliveryHeader (DeliveryID, SalesOrderID, DeliveryDate, Status) VALUES
('D001', 'SO001', '2024-01-05', 'Teslim Edildi'),
('D002', 'SO002', NULL, 'Teslim Edilmedi'),
('D003', 'SO003', '2024-01-08', 'Teslim Edilmedi'),
('D004', 'SO004', '2024-01-09', 'Teslim Edilmedi'),
('D005', 'SO005', '2024-01-10', 'Teslim Edildi'),
('D006', 'SO006', '2024-01-11', 'Teslim Edilmedi'),
('D007', 'SO007', '2024-01-12', 'Teslim Edildi'),
('D008', 'SO008', '2024-01-13', 'Teslim Edilmedi'),
('D009', 'SO009', '2024-01-14', 'Teslim Edilmedi'),
('D010', 'SO010', '2024-01-15', 'Teslim Edildi');
INSERT INTO DeliveryItem (DeliveryID, ItemID, ProductID, Quantity) VALUES
('D001', 1, 'P001', 100),
('D001', 2, 'P002', 200),
('D003', 1, 'P004', 50),
('D003', 2, 'P005', 75),
('D004', 1, 'P006', 100),
('D004', 2, 'P007', 125),
('D005', 1, 'P008', 150),
('D005', 2, 'P009', 175),
('D006', 1, 'P010', 200),
('D006', 2, 'P011', 225),
('D007', 1, 'P012', 250),
('D007', 2, 'P013', 275);
INSERT INTO InvoiceHeader (InvoiceID, SalesOrderID, InvoiceDate, Status) VALUES
('INV001', 'SO001', '2024-01-10', 'Aktif'),
('INV002', 'SO002', NULL, 'İptal'),
('INV003', 'SO003', '2024-01-13', 'Aktif'),
('INV004', 'SO004', '2024-01-14', 'İptal'),
('INV005', 'SO005', '2024-01-15', 'Aktif'),
('INV006', 'SO006', '2024-01-16', 'İade'),
('INV007', 'SO007', '2024-01-17', 'Aktif'),
('INV008', 'SO008', '2024-01-18', 'İptal'),
('INV009', 'SO009', '2024-01-19', 'Aktif'),
('INV010', 'SO010', '2024-01-20', 'Aktif');
INSERT INTO InvoiceItem (InvoiceID, ItemID, ProductID, Quantity) VALUES
('INV001', 1, 'P001', 100),
('INV001', 2, 'P002', 200),
('INV003', 1, 'P004', 50),
('INV003', 2, 'P005', 75),
('INV004', 1, 'P006', 100),
('INV004', 2, 'P007', 125),
('INV005', 1, 'P008', 150),
('INV005', 2, 'P009', 175),
('INV006', 1, 'P010', 200),
('INV006', 2, 'P011', 225),
('INV007', 1, 'P012', 250),
('INV007', 2, 'P013', 275);
INSERT INTO AccountingHeader (AccountingDocumentID, InvoiceID, PostingDate, Status) VALUES
('ACCT001', 'INV001', '2024-01-15', 'Aktif'),
('ACCT002', 'INV002', NULL, 'İptal'),
('ACCT003', 1, 'A001', 50),
('ACCT003', 2, 'A002', 75),
('ACCT004', 1, 'A003', 100),
('ACCT004', 2, 'A004', 125),
('ACCT005', 1, 'A005', 150),
('ACCT005', 2, 'A006', 175),
('ACCT006', 1, 'A007', 200),
('ACCT006', 2, 'A008', 225),
('ACCT007', 1, 'A009', 250);
INSERT INTO AccountingItem (AccountingDocumentID, ItemID, AccountID, Amount) VALUES
('ACCT001', 1, 'A001', 1500),
('ACCT001', 2, 'A002', 2000),
('ACCT003', 1, 'A001', 50),
('ACCT003', 2, 'A002', 75),
('ACCT004', 1, 'A003', 100),
('ACCT004', 2, 'A004', 125),
('ACCT005', 1, 'A005', 150),
('ACCT005', 2, 'A006', 175),
('ACCT006', 1, 'A007', 200),
('ACCT006', 2, 'A008', 225),
('ACCT007', 1, 'A009', 250);
--Her müşterinin
en son sipariş tarihi ve toplam satın alma miktarı:
BEGIN
var_out = SELECT CustomerID,
MAX(OrderDate) AS LatestOrderDate,
SUM(Quantity) AS TotalQuantity
FROM SalesHeader sh
JOIN SalesItem si ON sh.SalesOrderID = si.SalesOrderID
GROUP BY CustomerID;
END;
--Her müşterinin
toplam satış miktarı:
BEGIN
var_out = SELECT sh.CustomerID,
SUM(si.Quantity) AS TotalQuantity
FROM SalesHeader sh
JOIN SalesItem si ON sh.SalesOrderID = si.SalesOrderID
GROUP BY sh.CustomerID;
END;
--İptal edilen
faturaların toplam miktarı:
BEGIN
var_out = SELECT
SUM(ii.Quantity) AS TotalCancelledAmount
FROM InvoiceHeader ih
JOIN InvoiceItem ii ON ih.InvoiceID = ii.InvoiceID
WHERE ih.Status = 'İptal';
END;
--Belirli bir
tarih aralığında yapılan muhasebe kayıtlarının toplam miktarı:
BEGIN
var_out = SELECT
PostingDate,
SUM(Amount) AS TotalAmount
FROM AccountingHeader ah
JOIN AccountingItem ai ON ah.AccountingDocumentID = ai.AccountingDocumentID
WHERE ah.PostingDate BETWEEN '2024-01-01' AND '2024-01-18'
GROUP BY PostingDate;
END;
--Teslim
edilmemiş siparişlerin sipariş numaraları ve sıralama numaraları:
BEGIN
var_out =
SELECT dh.SalesOrderID, ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
FROM SalesHeader sh
LEFT JOIN DeliveryHeader dh ON sh.SalesOrderID = dh.SalesOrderID
WHERE dh.DeliveryID IS NULL;
END;
--İptal edilen
faturaların sipariş numaraları ve toplam miktarı:
BEGIN
var_out = SELECT ih.InvoiceID,
SUM(ii.Quantity) AS TotalCancelledAmount
FROM InvoiceHeader ih
JOIN InvoiceItem ii ON ih.InvoiceID = ii.InvoiceID
WHERE ih.Status = 'İptal'
GROUP BY ih.InvoiceID;
END;
--Belirli bir
tarih aralığında yapılan muhasebe kayıtlarının belirli bir değer üzerindeki
miktarları:
BEGIN
var_out = SELECT PostingDate,
CASE WHEN TotalAmount >= 1000 THEN 'High'
WHEN TotalAmount >= 500 THEN 'Medium'
ELSE 'Low'
END AS AmountLevel
FROM (
SELECT ah.PostingDate,
COALESCE(SUM(ai.Amount), 0) AS TotalAmount
FROM AccountingHeader ah
JOIN AccountingItem ai ON ah.AccountingDocumentID = ai.AccountingDocumentID
WHERE ah.PostingDate BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY ah.PostingDate
) AS AmountInfo;
END;
-- Fatura Başına
Ortalama Ürün Miktarı
BEGIN
var_out = SELECT
ih.InvoiceID,
AVG(ii.Quantity) AS AverageQuantity
FROM InvoiceHeader ih
JOIN InvoiceItem ii ON ih.InvoiceID = ii.InvoiceID
GROUP BY ih.InvoiceID;
END;
-- Müşterilerin
Sipariş Sayıları ve Sıralaması
BEGIN
var_out =SELECT
CustomerID,
OrderCount,
ROW_NUMBER() OVER (ORDER BY OrderCount DESC) AS Rank
FROM (
SELECT
sh.CustomerID,
COUNT(sh.SalesOrderID) AS OrderCount
FROM SalesHeader sh
GROUP BY sh.CustomerID) AS OrderCounts;
END:
-- Fiyata Göre Ürünlerin
En Yüksek ve En Düşük Miktarları
BEGIN
var_out
= SELECT
ProductID,
MAX(Quantity) AS MaxQuantity,
MIN(Quantity) AS MinQuantity
FROM SalesItem
GROUP BY ProductID;
END;
-- En Yüksek Miktarlı Ürünlerin Sipariş ve
Teslimat Durumları
BEGIN
var_out =SELECT
si.ProductID,
MAX(si.Quantity) AS MaxQuantity,
COALESCE(MAX(sh.Status), 'Aktif') AS SalesStatus,
COALESCE(MAX(dh.Status), 'Teslim Edilmedi') AS DeliveryStatus
FROM SalesItem si
LEFT JOIN SalesHeader sh ON si.SalesOrderID = sh.SalesOrderID
LEFT JOIN DeliveryHeader dh ON sh.SalesOrderID = dh.SalesOrderID
GROUP BY si.ProductID;
END;
Yorum Yap