Group lãi suất (Rate) theo số tiền huy động trong SQL

hoahuongduong1986

Thành viên thường trực
Tham gia ngày
14 Tháng mười một 2018
Bài viết
254
Được thích
19
Điểm
185
Tuổi
33
Kính gửi anh chi và các Bạn,
Em chạy code sau để lấy lãi suất - Rate và số tiền huy động.

declare @Stage SMALLINT
set @Stage = 3

SELECT Rate,format(sum(Sodu_amt),'#,#') as DN
FROM Bang1
where MaCN in ('HQ0310') and BUSINESS_DATE = '20200430'
Group by Rate

Được kết quả kiểu như sau:
1600159163890.png
Giờ em muốn Group số liệu này theo kiểu sau
1600159239543.png
Nếu làm cái này trên Excel thì đơn giản (Pivot rồi Group với By = 3 chẳng hạn). Nhưng nếu chạy trên SQL em chưa nghĩ ra cách làm.
Nếu em tạo một cột phụ trên SQL thì sẽ làm được nhưng cảm giác nó khá thủ công và chưa khoa học lắm. Có cách code gì SQL làm được kiểu này không ạ.
Em đang hình dung em sẽ khai báo một Biến như em đã làm trên là @Stage = 3 tức là bước nhảy để Group. Thì code sao để nó làm được như kết quả ạ.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,204
Được thích
12,380
Điểm
1,560
Toi đoán là kjhi nói SQL là bạn muốn nói T_SQL. Chứ mỗi phiên bản có cách sử lý khác.

T-SQL: Cách dễ nhất là làm một bảng tạm rồi join vào bảng đó. Tìm hiểu về With Common_Table_Expression
Cách thứ hai là làm một con toán để group by
Group by Floor((Rate-6.9)/@Stage)/3)
 
Lần chỉnh sửa cuối:

hoahuongduong1986

Thành viên thường trực
Tham gia ngày
14 Tháng mười một 2018
Bài viết
254
Được thích
19
Điểm
185
Tuổi
33
Toi đoán là kjhi nói SQL là bạn muốn nói T_SQL. Chứ mỗi phiên bản có cách sử lý khác.

T-SQL: Cách dễ nhất là làm một bảng tạm rồi join vào bảng đó. Tìm hiểu về With Common_Table_Expression
SQL Server anh ạ. Cái ;With Tên As (statement) thì em biết ạ. Tại em không muốn dùng bảng tạm mà có thể tính toán được không ạ.
 

tigertiger

Coming back ...
Tham gia ngày
25 Tháng một 2007
Bài viết
1,646
Được thích
1,570
Điểm
860
Kính gửi anh chi và các Bạn,
Em chạy code sau để lấy lãi suất - Rate và số tiền huy động.

declare @Stage SMALLINT
set @Stage = 3

SELECT Rate,format(sum(Sodu_amt),'#,#') as DN
FROM Bang1
where MaCN in ('HQ0310') and BUSINESS_DATE = '20200430'
Group by Rate

Được kết quả kiểu như sau:
View attachment 245574
Giờ em muốn Group số liệu này theo kiểu sau
View attachment 245575
Nếu làm cái này trên Excel thì đơn giản (Pivot rồi Group với By = 3 chẳng hạn). Nhưng nếu chạy trên SQL em chưa nghĩ ra cách làm.
Nếu em tạo một cột phụ trên SQL thì sẽ làm được nhưng cảm giác nó khá thủ công và chưa khoa học lắm. Có cách code gì SQL làm được kiểu này không ạ.
Em đang hình dung em sẽ khai báo một Biến như em đã làm trên là @Stage = 3 tức là bước nhảy để Group. Thì code sao để nó làm được như kết quả ạ.
Kiểu gì cũng phải nhập các cái 6.9, 9.9 vào đâu đó

Nên phải nghĩ đễn phương án Select của Select kết hợp với CASE để phân nhóm
là có thể
 

hoahuongduong1986

Thành viên thường trực
Tham gia ngày
14 Tháng mười một 2018
Bài viết
254
Được thích
19
Điểm
185
Tuổi
33
Kiểu gì cũng phải nhập các cái 6.9, 9.9 vào đâu đó

Nên phải nghĩ đễn phương án Select của Select kết hợp với CASE để phân nhóm
là có thể
Dạ, em cũng nghĩ phương án này rồi ạ. Tại em muốn hỏi anh chị nào dùng nhiều có biết kiểu gì mới không ạ. Cảm ơn anh ạ.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,204
Được thích
12,380
Điểm
1,560
SQL Server anh ạ. Cái ;With Tên As (statement) thì em biết ạ. Tại em không muốn dùng bảng tạm mà có thể tính toán được không ạ.
Thì dùng cách thứ 2, truy vấn phụ:

Set @RateStart = 6.9
Select ConCat('From ', (@RateStart + aa.[Rate_Range]), 'To <', (@RateStart + aa.[Rate_Range] + 1)), aa.[Debit]
From
( Seclect Floor((Rate-@RateStart)/@Stage) [Rate_Range], Sodu_amt [Debit]
From Bang1
where MaCN in ('HQ0310') and BUSINESS_DATE = '20200430' and Rate >= @RateStart) aa
Group By aa.[Rate_Range]
 

hoahuongduong1986

Thành viên thường trực
Tham gia ngày
14 Tháng mười một 2018
Bài viết
254
Được thích
19
Điểm
185
Tuổi
33
Thì dùng cách thứ 2, truy vấn phụ:

Set @RateStart = 6.9
Select ConCat('From ', (@RateStart + aa.[Rate_Range]), 'To <', (@RateStart + aa.[Rate_Range] + 1)), aa.[Debit]
From
( Seclect Floor((Rate-@RateStart)/@Stage) [Rate_Range], Sodu_amt [Debit]
From Bang1
where MaCN in ('HQ0310') and BUSINESS_DATE = '20200430' and Rate >= @RateStart) aa
Group By aa.[Rate_Range]
Dạ vâng ạ. Để em thử xem sao ạ. Cảm ơn anh ạ.
 

hoahuongduong1986

Thành viên thường trực
Tham gia ngày
14 Tháng mười một 2018
Bài viết
254
Được thích
19
Điểm
185
Tuổi
33
Tôi gõ nhanh quá ở bài #6 nên quên mất. Chỗ aa.[Debit] phải là SUM(aa.[Debit]) [Tot Debit]
Em xem code của anh mà em chưa hiểu lắm ạ. A giải thích giúp em được không ạ. Table của em chỉ bao gồm trường Rate, Sodu_amt. Nhưng code của anh em thấy có nhiều trường mới nên em chưa hiểu lắm ạ.
+ aa.[Debit]
+ aa.[Rate_Range]
+ Cấu trúc From .....To với em cũng lạ.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,204
Được thích
12,380
Điểm
1,560
Em xem code của anh mà em chưa hiểu lắm ạ. A giải thích giúp em được không ạ. Table của em chỉ bao gồm trường Rate, Sodu_amt. Nhưng code của anh em thấy có nhiều trường mới nên em chưa hiểu lắm ạ.
+ aa.[Debit]
+ aa.[Rate_Range]
+ Cấu trúc From .....To với em cũng lạ.
Nó là tên tôi đặt thôi. Bạn dùng [nợ dư] tôi dịch ra là Debit.
Bạn dùng [Rate], tôi sửa thành [Rate_Range] vì tôi cho nó là một khoảng
Không có cấu trúc 'From' hay 'To' . Chỉ là những chuỗi tôi đặt vào hàm Concat để nó nói chuỗi thành:
From 6.9 To < 9.9
...
Hàm Concat có khả năng ép số thành chuỗi (6.9 -> '6.9'). Thay vì nếu dùng phép cộng chuỗi thì phải tự ép kiểu Convert(...)
 
Top Bottom