Sql 使用case和grouping函数用null值替换摘要行的文本值
我在这里编写了一个sql代码,我正在试图弄清楚如何使用case和grouping函数将文字值“ALL”替换为空值的摘要行。我还想过滤以AZ,MI,OH结尾的状态的结果。这是编写代码的正确方法吗Sql 使用case和grouping函数用null值替换摘要行的文本值,sql,sql-server,sql-server-2008,case,Sql,Sql Server,Sql Server 2008,Case,我在这里编写了一个sql代码,我正在试图弄清楚如何使用case和grouping函数将文字值“ALL”替换为空值的摘要行。我还想过滤以AZ,MI,OH结尾的状态的结果。这是编写代码的正确方法吗 SELECT AccountDescription AS Account, VendorState, SUM(invoicelineitemamount) as LineItemSum CASE WHEN ISNULL THEN '*ALL*' END FROM
SELECT AccountDescription AS Account, VendorState, SUM(invoicelineitemamount) as LineItemSum
CASE
WHEN ISNULL THEN '*ALL*'
END
FROM ap.dbo.Vendors
JOIN ap.dbo.Invoices
ON Vendors.VendorID = Invoices.VendorID
JOIN ap.dbo.invoicelineitems
ON Invoices.InvoiceID = InvoiceLineItems.InvoiceID
JOIN ap.dbo.GLAccounts
ON InvoiceLineItems.AccountNo = GLAccounts.AccountNo
WHERE VendorState IN ('AZ', 'MI', 'OH')
GROUP BY AccountDescription, VendorState WITH CUBE
如果列值来自数据,则分组函数返回0;如果列值是多维数据集操作生成的NULL,则返回1 您的select with case语句如下所示
Select
CASE WHEN (GROUPING(AccountDescription) = 1) THEN 'ALL'
ELSE AccountDescription
END AS Account
CASE WHEN (GROUPING(VendorState) = 1) THEN 'ALL'
ELSE VendorState
END AS VendorState,
SUM(invoicelineitemamount) as LineItemSum
首先,在SQL Server的未来版本中,
WITH CUBE
语法将被删除,不应使用<代码>按多维数据集分组()也应该这样做(或者您可能希望汇总
)
其次,将NULL
值更改为ALL
,您可以使用grouping()
函数或isnull()
第三,如果您的VendorState
只有两个字母,那么:
WHERE VendorState IN ('AZ','MI', 'OH')
是您想要的,但是如果它是一个较长的字符串(如Portland或),末尾带有状态代码,请使用下面的示例代码:
SELECT
CASE WHEN GROUPING(AccountDescription) = 1 THEN 'ALL' ELSE AccountDescription END AS Account,
ISNULL(AccountDescription, 'ALL') AS Account,
ISNULL(VendorState, 'ALL') AS VendorState,
SUM(invoicelineitemamount) as LineItemSum
FROM ap.dbo.Vendors
JOIN ap.dbo.Invoices
ON Vendors.VendorID = Invoices.VendorID
JOIN ap.dbo.invoicelineitems
ON Invoices.InvoiceID = InvoiceLineItems.InvoiceID
JOIN ap.dbo.GLAccounts
ON InvoiceLineItems.AccountNo = GLAccounts.AccountNo
--WHERE VendorState IN ('AZ','MI', 'OH')
WHERE
VendorState LIKE '%AZ' OR
VendorState LIKE '%MI' OR
VendorState LIKE '%OH'
GROUP BY CUBE(AccountDescription, VendorState)
有关更多信息,请参阅
另一方面,您可能希望熟悉表别名,这样就不必重复长表标识符,例如:
FROM ap.dbo.Vendors v
JOIN ap.dbo.Invoices i ON v.VendorID = i.VendorID
将分组设置为1有什么作用?我只是从书中复制了它,它没有解释为什么会这样做。@Lisa Tse,grouping函数对cube为summary返回的空值返回1rows@RADARSQL Server 2012无疑支持多维数据集,但它尚未被删除(2014年也没有)。ROLLUP在功能上并不等效-CUBE会为所有组合生成摘要行,ROLLUP不会。@jpw,谢谢,我搞混了,我记得他们在2012年删除了一些东西,而不是CUBE。@RADAR,如果我们将分组设置为2,会有区别吗?非常感谢澄清。看起来添加isnull子句确实将null值替换为“ALL”