Sql 使用case和grouping函数用null值替换摘要行的文本值

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

我在这里编写了一个sql代码,我正在试图弄清楚如何使用case和grouping函数将文字值“ALL”替换为空值的摘要行。我还想过滤以AZ,MI,OH结尾的状态的结果。这是编写代码的正确方法吗

  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”