Anasayfa / Yazılım / SQL / Toplama Fonksiyonlarının Veri Güncelleme İşlemlerinde Kullanılması

Toplama Fonksiyonlarının Veri Güncelleme İşlemlerinde Kullanılması

Önceki veri güncelleme yazılarında daha çok literal veriler üzerinde güncelleme işleminin nasıl yapıldığını gösterdim. Bu yazımda ise toplama fonksiyonları ile birlikte veri güncelleme işlemleri nasıl yapılır, buna değinmek istiyorum. Tabi burada toplama fonksiyonlarının kullanımı ile birlikte veri güncelleme işlemini direkt olarak yapamıyoruz, bunu belirtmek isterim. Bunun olmayacağını aşağıdaki örnek kodu çalıştırarak görebiliriz. AdventureWorks2012 veri tabanı üzerinde yeni bir query penceresi açıyorum ve aşağıdaki kodu yazıyorum:

UPDATE Deneme SET SubTotal = SUM(LineTotal) FROM Sales.SalesOrderHeader AS Deneme
INNER JOIN Sales.SalesOrderDetail AS test ON Deneme.SalesOrderID = Deneme.SalesOrderID;

kodunu yazdım ve çalıştırdım. Almış olduğum hata :

An aggregate may not appear in the set list of an UPDATE statement.

Aggregate fonksiyonunun yani toplama fonksiyonun UPDATE edilen veri listesi üzerinde görünmeyeceğine dair bir hata alırız. Peki bundan kurtulmak için ne yapmalıyız?

Bir ortak tablo içinde toplama fonskiyonumuzu ayırabiliriz ve daha sonra güncelleme yapmak için toplama fonksiyonu uygulanan değişkenleri kullanabiliriz. Konuyu örneklemeden önce demo tablolarımızı oluşturmak için aşağıdaki kodu kullanınız:

IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[demoCustomerSummary]')
AND type in (N'U'))
DROP TABLE [dbo].[demoCustomerSummary];
GO
CREATE TABLE dbo.demoCustomerSummary (CustomerID INT NOT NULL PRIMARY KEY,
SaleCount INTEGER NULL,
TotalAmount MONEY NULL);
GO
INSERT INTO dbo.demoCustomerSummary (CustomerID, SaleCount,TotalAmount)
SELECT BusinessEntityID, 0, 0
FROM dbo.demoPerson;

Bu sorgu sonucunda (994 row(s) affected) mesajını alırız.

Şimdi örneğimize geçelim, bu izoleyi nasıl yapabiliriz, görelim.

Öncelikle listeleme yapalım, neyi değiştireceğimizi görelim.

SELECT CustomerID, SaleCount, TotalAmount FROM dbo.demoCustomerSummary
WHERE CustomerID IN (11621,12798,13589,14465,18623);

dbo.demoCustomerSummary tablosunda CustomerID alanındaki değeri 11621,12798,13589,14465,18623 olan satırların CustomerID, SaleCount, TotalAmount alanlarını listeliyorum.

2013051103

Şimdi de ortak tablo üzerinde ifademizi yazalım.

WITH Totals AS (SELECT COUNT(*) AS SaleCount, SUM(TotalDue) AS TotalAmount, CustomerID
FROM dbo.demoSalesOrderHeader GROUP BY CustomerID) UPDATE Musteri 
SET TotalAmount = Totals.TotalAmount, SaleCount = Totals.SaleCount
FROM dbo.demoCustomerSummary AS Musteri INNER JOIN Totals
ON Musteri.CustomerID = Totals.CustomerID;

Bu sorgu sonucunda (8 row(s) affected) mesajını alırız.

Şimdi bir bakalım değişmiş mi?

SELECT CustomerID, SaleCount, TotalAmount FROM dbo.demoCustomerSummary
WHERE CustomerID IN (11621,12798,13589,14465,18623);

2013051104

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir