2013-05-01 19 views

cevap

15

ikisi. boş bir sonuç kümesinde bir sorgu çalıştırıyorsanız dışında aynı dönmek

WITH Sales(Sales) AS 
(
SELECT 1 
) 
SELECT 
     SUM(ISNULL(Sales,0)) AS Sales, 
     ISNULL(SUM(Sales),0) AS Sales 
FROM  Sales  
WHERE 1=0 

iade

Sales  Sales 
----------- ----------- 
NULL  0 

SUM(ISNULL(Sales,0)) sürümü, NULL toplanmasıyla ilgili ANSI UYARILARINI önler.

Diğer bir fark, ISNULL(SUM(Sales),0) sonuç sütununun veri türünün null olarak kabul edilmemesidir.

+0

güzel @martinsmith –

+0

boş dönecekti biralar? Sales_CTE İLE (SalesAndNulls) AS ( SEÇ 1 UNION SEC BOŞ ) SUM (ISNULL (SalesAndNulls, 0)) Sales1 AS ISNULL SEÇ (SUM (SalesAndNulls), 0) Sales2 OLARAK Sales_CTE DAN Satış1 = 1 Satış2 = 1 Uyarı: Boş değer, bir toplu işlem veya başka bir SET işlemi tarafından yok edilir. (etkilenen 1 satır (lar)) – Alborz

+0

@Alborz - Evet o 'Sales2' sürümden ANSI UYARI bulunuyor. Sen couse 'ISNULL (SUM (ISNULL (SalesAndNulls, 0)), 0) yapabilirdi ayarladığınız boş sonuca 0'' dönmek ve herhangi bir uyarı görmüyor istiyorsa Sales3' AS. –

2

birincisi her Satış alanı

SUM yukarı diyor ve saha NULL ise, sıfır olarak ona iyi davran.

ikinci Toplamı kadar satış alanını diyor ve toplam NULL ise (bu konuda uyardı olacak rağmen),

Ancak SUM() komutu NULL atlar ... yerine sıfır rapor ilki

3

bu deneyin hata mesaj almak etmemenizi neden olur böylece:

DECLARE @table TABLE 
(
    id INT IDENTITY, 
    Alborz INT 
) 
INSERT INTO @table 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT NULL 

SELECT ISNULL(SUM(Alborz), 0) 
FROM @table 
SELECT SUM(ISNULL(Alborz, 0)) 
FROM @table 

DELETE FROM @table 

SELECT ISNULL(SUM(Alborz), 0) 
FROM @table 
SELECT SUM(ISNULL(Alborz, 0)) 
FROM @table 

Sen 21, 21, 0, ve NULL elde edersiniz. Boşları işlemek istemiyorsanız, ISNULL (SUM (X), 0) yoludur.

1

Evet bir fark var. Yanılmıyorsam Eğer

5 + NULL = NULL 

böylece ilk vaka

SUM(ISNULL(Sales,0)) AS Sales 

0'a boş değerini değiştirmek istiyorum ve daha sonra ikinci durumda

ISNULL(SUM(Sales),0) AS Sales, 

ise 5
dönecekti ki bunları topladığınızda kelimenin S kullanımı üzerinde aynı verilerde