2012-09-12 43 views
4

我公司目前拥有空值,低于该脚本中使用汇总汇总了一些数据:卸下子总数/在TSQL汇总总计

SELECT 
     CASE 
      WHEN GROUPING(Custodian) = 1 
       THEN 'Grand Total' 
      WHEN GROUPING(PortfolioID) = 1 
       THEN Custodian+''+'Total' 
      ELSE Custodian 

     END AS Custodian 

    , PortfolioID 
    , PortfolioBaseCCY 
    , [Date] 
    , SUM(AmountTotalBaseEquiv) AS AmountTotalBaseEquiv 
    , ExchangeRate 
    , AmountTotalBaseEquivUSD 
    , PortfolioNAVUSD 
    , SUM(TotalCashPctNAV) AS TotalCashPctNAV 

FROM @ResultSet 
WHERE TotalCashPctNAV > 5 
GROUP BY Custodian 
    , PortfolioID 
    , PortfolioBaseCCY 
    , [Date] 
    , AmountTotalBaseEquiv 
    , ExchangeRate 
    , AmountTotalBaseEquivUSD 
    , PortfolioNAVUSD 
    , TotalCashPctNAV WITH ROLLUP 

HAVING GROUPING_ID(Custodian 
    , PortfolioID 
    , PortfolioBaseCCY 
    , [Date] 
    , AmountTotalBaseEquiv 
    , ExchangeRate 
    , AmountTotalBaseEquivUSD 
    , PortfolioNAVUSD 
    , TotalCashPctNAV) IN (1,255,511) 

ORDER BY CASE WHEN GROUPING(Custodian) = 1 THEN 2 ELSE 1 END, Custodian, TotalCashPctNAV DESC, PortfolioID 

这将返回数据,如作为一个例子:

Custodian PortfolioID PortfolioBaseCCY Date   AmountTotalBaseEquiv ExchangeRate AmountTotalBaseEquivUSD PortfolioNAVUSD TotalCashPctNAV 
XXXX  TEST  USD    11/09/2012 85708860.21   1    85708860.21    370253861.3  23.15 
XXXX Total NULL  NULL    NULL   85708860.21   NULL   NULL     NULL   23.15 
ZZZZ  TEST1  GBP    11/09/2012 48427.91    0.6225   77795.84    77795.84  100 
ZZZZ  TEST2  GBP    11/09/2012 7772.61    0.6225   12486.12    12486.12  100 
ZZZZ  TEST3  USD    11/09/2012 1832627.81   1    1832627.81    17343500.68  10.56 
ZZZZ Total NULL  NULL    NULL   1888828.33   NULL   NULL     NULL   210.56 
Grand Total NULL  NULL    NULL   310273031.4   NULL   NULL     NULL   1051.71 

什么我希望NULLS成为'',这样只有Total标签和两个总和是该特定行上唯一的数据位,这可能吗?

回答

1

如果你是好与出现在两个数据行和总行为空字符串NULL值,您可以将所有非字符串列转换为字符串,并使用COALESCE(或ISNULL),如:

SELECT 
     CASE 
      WHEN GROUPING(Custodian) = 1 
       THEN 'Grand Total' 
      WHEN GROUPING(PortfolioID) = 1 
       THEN Custodian+' '+'Total' 
      ELSE Custodian 

     END AS Custodian 

    , COALESCE(PortfolioID,'') AS PortfolioID 
    , COALESCE(PortfolioBaseCCY,'') AS PortfolioBaseCCY 
    , COALESCE(CONVERT(char(10),[Date],101),'') AS [Date] 
    , SUM(AmountTotalBaseEquiv) AS AmountTotalBaseEquiv 
    , COALESCE(CONVERT(char(10),ExchangeRate),'') AS ExchangeRate 
    , COALESCE(CONVERT(char(20),AmountTotalBaseEquivUSD),'') AS AmountTotalBaseEquivUSD 
    , COALESCE(CONVERT(char(20),PortfolioNAVUSD),'') AS PortfolioNAVUSD 
    , SUM(TotalCashPctNAV) AS TotalCashPctNAV 

FROM @ResultSet 
WHERE TotalCashPctNAV > 5 
GROUP BY Custodian 
    , PortfolioID 
    , PortfolioBaseCCY 
    , [Date] 
    , AmountTotalBaseEquiv 
    , ExchangeRate 
    , AmountTotalBaseEquivUSD 
    , PortfolioNAVUSD 
    , TotalCashPctNAV WITH ROLLUP 

HAVING GROUPING_ID(Custodian 
    , PortfolioID 
    , PortfolioBaseCCY 
    , [Date] 
    , AmountTotalBaseEquiv 
    , ExchangeRate 
    , AmountTotalBaseEquivUSD 
    , PortfolioNAVUSD 
    , TotalCashPctNAV) IN (1,255,511) 

ORDER BY CASE WHEN GROUPING(Custodian) = 1 THEN 2 ELSE 1 END, Custodian, TotalCashPctNAV 

否则,你可以使用的情况下表达,因为你做了与托管人,以确定哪些行的总数。例如:

CASE WHEN GROUPING(Custodian) + GROUPING(PortfolioId) > 0 THEN '' 
    ELSE PortfolioID END AS PortfolioID 
+0

这很好,谢谢。我遵循了COALESCE的方式,因为我们永远不会在没有记录的情况下出现null。谢谢你的帮助 –

+0

不客气。乐意效劳。 – GilM

3

您可以使用ISNULL()函数在SQL像这样一个空格来代替NULL:

SELECT 
    CASE 
     WHEN GROUPING(Custodian) = 1 
      THEN 'Grand Total' 
     WHEN GROUPING(PortfolioID) = 1 
      THEN Custodian+''+'Total' 
     ELSE Custodian 

    END AS Custodian 

, isNUll(PortfolioID,'') 
, isNull(PortfolioBaseCCY,'') 
, isNull([Date],'') 
, SUM(AmountTotalBaseEquiv) AS AmountTotalBaseEquiv 
, isNull(ExchangeRate,'') 
, isNull(AmountTotalBaseEquivUSD,'') 
, isNull(PortfolioNAVUSD,'') 
, SUM(TotalCashPctNAV) AS TotalCashPctNAV