COMPUTER ENGINEER

Örneklere git
Blog
SQL Server / T-SQL6 dk çalışma
22/ 65

İlişkiler ve JOIN

Fan-out ve çift sayma

Doğru çalışan sorgu yanlış rakam üretebilir.

AnlaÖrneği inceleKendin uygula

Kavramı anlayalım

Bir-çok JOIN satırları çoğaltır. Sipariş kalemlerine bağladığın SalesOrder tablosunda COUNT(*) artık sipariş sayısı değildir. İki farklı bir-çok tabloyu aynı üst kayda bağlamak daha da büyüyen bir çarpım oluşturabilir. Sorgunun hatasız çalışması ölçünün doğru olduğunu göstermez.

Çözüm, hesaplamak istediğin ölçünün grain’ini korumaktır. Kalem tutarlarını sipariş başına önceden grupla, sonra müşteriye bağla. COUNT(DISTINCT OrderId) sipariş sayısını düzeltebilir, fakat SUM(DISTINCT Amount) eşit tutarlı farklı siparişleri yanlışlıkla birleştirir. DISTINCT bir modelleme ilacı değildir.

NERESİNDE KULLANIRSIN?

Ciro, sipariş sayısı ve ortalama gibi iş ölçülerini JOIN sonrasında doğrularken.

SIK YAPILAN HATA

SUM(DISTINCT Total) kullanarak çift saymayı gizlemek.

01 / UYGULAMA

Aynı konu. Üç farklı derinlik.

T-SQL / SQL Server 2019+
SELECT COUNT(*) AS JoinedRows, COUNT(DISTINCT o.OrderId) AS Orders FROM lab.SalesOrder AS o
JOIN lab.OrderItem AS i ON i.OrderId = o.OrderId;

18 kalem eşleşmesi, 12 gerçek sipariş.

Bu sayfa SQL çalıştırmaz. Örnekleri indirilebilir SqlStudioLab veritabanında, SSMS’de uygula. Geçici tablo örneklerini yeniden çalıştırırken yalnız ilgili #tabloyu temizle. VIEW, procedure ve function örnekleri lab’da kalıcı nesne oluşturur; üretim bağlantısı kullanma.

02 / SIRA SENDE

Önce kendin dene.

Ödenmiş sipariş sayısını kalem JOIN’i varken doğru hesapla.

Çözümü ve açıklamasını göster
Açıklamalı çözüm
SELECT COUNT(DISTINCT o.OrderId) AS PaidOrders FROM lab.SalesOrder AS o JOIN lab.OrderItem AS i ON i.OrderId = o.OrderId WHERE o.Status = 'Paid';

9 döner; COUNT(*) ise 15 ödenmiş kalem döndürür.