2012-09-12 42 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