0

ランク関数を使用して列を合計し、月ごとにグループ化しようとしています。コードは次のとおりです。

 select  dbo.UpCase( REPLACE( p.Agent_name,'.',' '))as Agent_name, SUM(convert ( float ,   
  p.Amount))as amount,   
  RANK() over( order by  SUM(convert ( float ,Amount )) desc ) as arank 
  from  dbo.T_Client_Pc_Reg p  
  group by   p.Agent_name ,p.Sale_status ,MONTH(Reg_date)
  having [p].Sale_status='Activated'

現在、月単位ではなく、その列のすべての合計値を取得しています

Name  amount rank 
a     100    1
b     80     2
c     50     3

金額100は今までの合計金額ですが、先月ではなく当月の合計金額を取得したいのですが。

4

1 に答える 1

1

たぶん、WHERE句を追加する必要がありますか?これは、一般的にうまくいくと思うマイナーな書き直しです。tempdbのいくつかのセットアップ:

USE tempdb;
GO

CREATE TABLE dbo.T_Client_Pc_Reg
(
  Agent_name VARCHAR(32),
  Amount INT,
  Sale_Status VARCHAR(32),
  Reg_date DATETIME
);

INSERT dbo.T_Client_Pc_Reg 
          SELECT 'a', 50, 'Activated', GETDATE()
UNION ALL SELECT 'a', 50, 'Activated', GETDATE()
UNION ALL SELECT 'b', 20, 'Activated', GETDATE()
UNION ALL SELECT 'b', 20, 'Activated', GETDATE()
UNION ALL SELECT 'b', 20, 'Activated', GETDATE()
UNION ALL SELECT 'b', 20, 'Activated', GETDATE()
UNION ALL SELECT 'b', 20, 'NotActivated', GETDATE()
UNION ALL SELECT 'c', 25, 'Activated', GETDATE()
UNION ALL SELECT 'c', 25, 'Activated', GETDATE()
UNION ALL SELECT 'c', 25, 'Activated', GETDATE()-40;

次に、クエリ:

SELECT 
  Agent_name = UPPER(REPLACE(Agent_name, '.', '')),
  Amount = SUM(CONVERT(FLOAT, Amount)),
  arank = RANK() OVER (ORDER BY SUM(CONVERT(FLOAT, Amount)) DESC)
FROM dbo.T_Client_Pc_Reg
WHERE Reg_date >= DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0)
  AND Reg_date <  DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)
  AND Sale_status = 'Activated'
GROUP BY UPPER(REPLACE(Agent_name, '.', ''))
ORDER BY arank;

今クリーンアップ:

USE tempdb;
GO
DROP TABLE dbo.T_Client_Pc_Reg;
于 2012-05-01T00:19:35.577 に答える