Sql 从Rollup函数中删除NULL
我正在使用汇总功能,我几乎达到了我所需要的完美点,只需要删除一个小东西Sql 从Rollup函数中删除NULL,sql,sql-server,rollup,Sql,Sql Server,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 @A
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
如何使所有存储区中的空值全部消失?一种方法是将查询包装在
选择中,然后在要替换空值的列上使用合并
:
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
一种方法是将查询包装在一个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
您的问题似乎在以下方面:
CASE WHEN (GROUPING(b.currencydesc) = 1) THEN 'Store #' + s.StoreID + ' TOTAL' ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as [Tender Type],
考虑这一点:
SELECT '1' + NULL
这将返回NULL。改为使用合并:
SELECT COALESCE('1' + NULL,'')
这将返回“”。我想在上面的场景中StoreId是空的。以下是完整的代码:
CASE WHEN (GROUPING(b.currencydesc) = 1) THEN COALESCE('Store #' + s.StoreID + ' TOTAL','') ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as [Tender Type],
祝你好运。你的问题似乎在以下方面:
CASE WHEN (GROUPING(b.currencydesc) = 1) THEN 'Store #' + s.StoreID + ' TOTAL' ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as [Tender Type],
考虑这一点:
SELECT '1' + NULL
这将返回NULL。改为使用合并:
SELECT COALESCE('1' + NULL,'')
这将返回“”。我想在上面的场景中StoreId是空的。以下是完整的代码:
CASE WHEN (GROUPING(b.currencydesc) = 1) THEN COALESCE('Store #' + s.StoreID + ' TOTAL','') ELSE ISNULL(b.currencydesc, 'UNKNOWN') END as [Tender Type],
祝你好运