Tsql 案例陈述中的多个分组&;订购
我目前正在处理一个聚合存储过程,我的最终选择如下所示:Tsql 案例陈述中的多个分组&;订购,tsql,grouping,rollup,Tsql,Grouping,Rollup,我目前正在处理一个聚合存储过程,我的最终选择如下所示: SELECT CASE WHEN GROUPING(Custodian) = 1 THEN 'Grand Total' ELSE Custodian END AS Custodian , PortfolioID , PortfolioBaseCCY , [Date] , S
SELECT
CASE
WHEN GROUPING(Custodian) = 1
THEN 'Grand 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 ABS(TotalCashPctNAV) DESC
但是,我想在案例陈述中添加另一个分组,即:
CASE
WHEN GROUPING(Custodian) = 1
THEN 'Grand Total'
WHEN GROUPING(PortfolioID) = 1
THEN Custodian+''+'Total'
ELSE Custodian
但是它不起作用,因为第二种情况不返回值,这是为什么
此外,我还想订购上述选择中的TotalCashPctNAV:
ORDER BY ABS(TotalCashPctNAV) DESC
然而,这似乎不起作用。我希望它的顺序是,它的ABS值在每个portfolioID小计之间递减
任何帮助都将不胜感激。将第二个分组添加到案例陈述中,效果与我预期的一样。AmounttotalBaseEquiv和TotalCashPct列中填充的值与Grand Total行中的值相同,保管人列的名称似乎与各个保管人总计的名称相同 我怀疑排序问题与以下事实有关:显示的列实际上是TotalCashPctNAV的总和,它被别名回“TotalCashPctNAV”。ORDER BY语句针对的是实际的TotalCashPctNAV列,而不是别名SUM 有趣的是,如果orderby语句不使用ABS,那么排序就是我所期望的。我不知道为什么ABS会导致订单不同,因为我用了所有积极的术语作为例子 例如:
DECLARE @ResultSet TABLE
(
Custodian VARCHAR(10),
PortfolioID INT,
PortfolioBaseCCY INT,
[Date] DATETIME,
AmountTotalBaseEquiv NUMERIC(8,2),
PortfolioNAVUSD NUMERIC(8,2),
TotalCashPctNAV NUMERIC(8,2),
ExchangeRate NUMERIC(8,2),
AmountTotalBaseEquivUSD NUMERIC(8,2)
)
INSERT INTO @ResultSet SELECT 'Anne', 1, 1, '6/1/2012', '600.00', '643.45', '3.78', '2.00', '353.00'
INSERT INTO @ResultSet SELECT 'Bob', 2, 1, '6/13/2012', '745.00', '9.42', '36.70', '1.70', '353.00'
INSERT INTO @ResultSet SELECT 'Carl', 3, 1, '6/27/2012', '488.00', '9875.99', '6.60', '1.80', '353.00'
INSERT INTO @ResultSet SELECT 'Doug', 4, 1, '6/29/2012', '87.00', '45.98', '69.12', '2.10', '353.00'
INSERT INTO @ResultSet SELECT 'Elmer', 5, 1, '6/30/2012', '775.00', '78.47', '69.78', '2.41', '353.00'
INSERT INTO @ResultSet SELECT 'Bob', 6, 1, '6/30/2012', '775.00', '78.47', '69.78', '2.41', '353.00'
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 TotalCashPctNAVSUM --I appended SUM to the alias
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 ABS(TotalCashPctNAV) DESC --works with TotalCashPctNAV but not TotalCashPctNAVSUM
--ORDER BY TotalCashPctNAV DESC --works as initially expected