2014-11-21 47 views
0

我有一个SQL代码在这里我做了,我试图找出如何使用情况和分组功能来代替文字值“所有“为空值的汇总行。我也想过滤以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

GROUPING函数返回0,如果该列值从数据来,1,如果该列值是由CUBE操作生成的NULL。

与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 
+0

什么设置分组等于1吗?我只是从书中复制它,它没有提供解释它为什么这样做。 – 2014-11-21 00:44:20

+0

@Lisa谢霆锋,分组功能通过多维数据汇总行返回null值,则返回1 – radar 2014-11-21 01:02:54

+0

@RADAR SQL Server 2012的肯定支持CUBE,它尚未删除(未在2014年任)。 ROLLUP在功能上并不等同 - CUBE为所有组合生成汇总行,ROLLUP不会。 – jpw 2014-11-21 01:26:21

0

首先,WITH CUBE语法在SQL Server的未来版本被删除,不应该被使用; GROUP BY CUBE()应该这样做(或者你可能想要ROLLUP)。

二,将NULL值更改为ALL您可以使用grouping()函数或isnull()

第三,如果你VendorState只是两个字母则是:

WHERE VendorState IN ('AZ','MI', 'OH') 

是你想要的,但如果它是一个较长的字符串(如Portland, OR),并在最后的状态代码,做这样的样本代码如下:

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) 

查看reference documentation for GROUP BY了解更多信息。

在一个侧面说明,你可能要熟悉你可以用它来不必重复长表标识符,例如表的别名:

FROM ap.dbo.Vendors v 
JOIN ap.dbo.Invoices i ON v.VendorID = i.VendorID 
+0

非常感谢您的澄清,您可以接受答案。它看起来像添加isnull子句确实将空值替换为'ALL' – 2014-11-21 01:54:39