2013-02-04 50 views
1

我正在使用匯總功能,而且我幾乎處於所需的完美位置,只需刪除一件小事即可。從彙總函數中刪除NULL

declare @FromDate datetime 
declare @ToDate datetime 
declare @StoreNumber varchar(10) 
declare @AllStores varchar(1) 
set @FromDate = '1/1/12' 
set @ToDate = '1/1/13' 
set @StoreNumber = '01' 
set @AllStores = 'y' 

If @AllStores = 'Y' 
Begin 
select 
CASE WHEN (GROUPING(s.StoreID) = 1) THEN 'All Stores' ELSE ISNULL(s.StoreID, 'UNKNOWN') END as 'Store #', 
CASE WHEN (GROUPING(b.currencydesc) = 1) THEN 'Store #' + s.StoreID + ' TOTAL' ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as 'Tender Type', SUM(amount) as Total 
from RPTrs s 
join rpPay p on s.storeid = p.StoreID and s.ReceiptNO = p.ReceiptNo 
join Currencies b on b.POSCurrency = LEFT(p.paytype,1) 
where trsdate between @FromDate and @ToDate 
group by s.storeid, b.currencydesc with rollup 
End 
Else 
Begin 
select 
s.StoreID as 'Store #', 
CASE WHEN (GROUPING(b.currencydesc) = 1) THEN 'Store #' + s.StoreID + ' TOTAL' ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as 'Tender Type', SUM(amount) as Total 
from RPTrs s 
join rpPay p on s.StoreID = p.StoreID and s.ReceiptNO = p.ReceiptNo 
join Currencies b on b.POSCurrency = LEFT(p.paytype,1) 
where trsdate between @FromDate and @ToDate 
and s.StoreID = @StoreNumber 
group by grouping sets((s.StoreID),(s.StoreID, b.CurrencyDesc)) 
End 

有了這個輸出。

Store # Tender Type Total 
01 Amex 250.00 
01 C.Card 3138.00 
01 Cash 53553.17 
01 Gift Card 1595.35 
01 MasterCard 813.10 
01 Off Line C.Card 247.53 
01 Str Cr -544.45 
01 Visa/MC 437.35 
01 Store #01 TOTAL 59490.05 
02 Cash 238.15 
02 Store #02 TOTAL 238.15 
All Stores NULL 59728.20 

如何讓所有商店的NULL消失?要做到這一點

回答

1

一種方式是包裹在SELECT查詢,然後你要替換的null值的列使用COALESCE

SELECT [store #], 
     COALESCE([tender type], '') [Tender Type], 
     total 
FROM 
(
    SELECT 
     CASE 
      WHEN (Grouping(s.storeid) = 1) 
      THEN 'All Stores' 
      ELSE Isnull(s.storeid, 'UNKNOWN') 
     END   AS [Store #], 
     CASE 
      WHEN (Grouping(b.currencydesc) = 1) 
      THEN 'Store #' + s.storeid + ' TOTAL' 
      ELSE Isnull(b.currencydesc, 'UNKNOWN') 
     END   AS [Tender Type], 
     Sum(amount) AS Total 
    FROM rptrs s 
    JOIN rppay p 
     ON s.storeid = p.storeid 
     AND s.receiptno = p.receiptno 
    JOIN currencies b 
     ON b.poscurrency = LEFT(p.paytype, 1) 
    WHERE trsdate BETWEEN @FromDate AND @ToDate 
    GROUP BY s.storeid, b.currencydesc WITH rollup 
) src 

或者你可以在COALESCE()包裹欄沒有子查詢:

SELECT 
    CASE 
     WHEN (Grouping(s.storeid) = 1) 
     THEN 'All Stores' 
     ELSE Isnull(s.storeid, 'UNKNOWN') 
    END    AS [Store #], 
    COALESCE(CASE 
       WHEN (Grouping(b.currencydesc) = 1) 
       THEN 'Store #' + s.storeid + ' TOTAL' 
       ELSE Isnull(b.currencydesc, 'UNKNOWN') 
      END, '') AS [Tender Type], 
    Sum(amount)  AS Total 
FROM rptrs s 
JOIN rppay p 
    ON s.storeid = p.storeid 
    AND s.receiptno = p.receiptno 
JOIN currencies b 
    ON b.poscurrency = LEFT(p.paytype, 1) 
WHERE trsdate BETWEEN @FromDate AND @ToDate 
GROUP BY s.storeid, b.currencydesc WITH rollup 
0

看來你的問題是以下行:

CASE WHEN (GROUPING(b.currencydesc) = 1) THEN 'Store #' + s.StoreID + ' TOTAL' ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as [Tender Type], 

考慮一下:

SELECT '1' + NULL 

這將返回NULL。改用COALESCE:

SELECT COALESCE('1' + NULL,'') 

這將返回''。我想你的上面的場景中StoreId是NULL。以下是完整的代碼:

CASE WHEN (GROUPING(b.currencydesc) = 1) THEN COALESCE('Store #' + s.StoreID + ' TOTAL','') ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as [Tender Type], 

祝你好運。