【问题标题】:Removing the NULL from Rollup Function从汇总函数中删除 NULL
【发布时间】:2013-02-04 15:47:53
【问题描述】:

我正在使用 Rollup 功能,我几乎可以满足我的需要,只需要删除一点点。

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 消失?

【问题讨论】:

    标签: sql sql-server rollup


    【解决方案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 
    

    【讨论】:

      【解决方案2】:

      您的问题似乎在以下行:

      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], 
      

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 2017-07-11
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多