繁体   English   中英

SQL 查询带动态条件

[英]SQL query with dynamic condition

我的桌子在这个SQL Fiddle Link

场景:我有一个Customer表(CustomerID,CustomerName)
CustomerBills表(客户 ID、账单日期、价值)

我也有一个Days表(dayValue,Name)
值如 (30, '1 Month') (60, '2 Months') (90, '3 Months')。

我需要根据天表查询每个客户的账单总和

  • 客户 1 - 从 0 到 30 - sum(Amount)=1000
  • 客户 2 - 从 0 到 30 - sum(Amount)=1200
  • 客户 1 - 从 30 到 60 - sum(Amount)=800

结果样本:

SQL 示例

这是需要的报告

结果

样本数据

CREATE TABLE tblAge
    ([AgeDays] int, [AgeName] varchar(400))
;
    
INSERT INTO tblAge
    ([AgeDays], [AgeName])
VALUES
    (30, 'From 0 to 30 Days'),
    (90, '3 Months'),
    (180, '6 Months');
    
    CREATE TABLE tblCustomer
    ([ID] int, [Name] varchar(400))
;
    
INSERT INTO tblCustomer
    ([id], [Name])
VALUES
    (1, 'Cust 1'),
    (2, 'Cust 2'),
    (3, 'Cust 3');
    
    CREATE TABLE tblBills
    ([ID] int, [billDate] Datetime,[Amount] decimal,[CustID] int)
; 
INSERT INTO  tblBills
    ([ID] , [billDate] ,[Amount] ,[CustID] )
VALUES
    (1, '2020-12-01',200,1),
    (2, '2022-01-01',500,3),
    (3, '2021-04-05',300,2),
    (4, '2020-01-01',500,3),
    (5, '2021-01-01',500,1),
    (6, '2021-11-01',500,2),
    (7, '2021-08-01',500,3),
    (8, '2021-09-01',500,2),
    (9, '2021-07-01',500,1)
    ;

您可以在tblAge表上使用LAG来获取先前的年龄分组,然后根据该间隔简单地加入

SELECT
  c.ID,
  c.Name,
  SUM(b.Amount)
FROM tblCustomer c
JOIN tblBills b ON b.CustId = c.ID
JOIN (
    SELECT *,
      PrevDays = LAG(AgeDays, 1, 0) OVER (ORDER BY AgeDays)
    FROM tblAge
) a ON b.billDate >= DATEADD(day, a.AgeDays, GETDATE())
   AND b.billDate < DATEADD(day, a.PrevDays, GETDATE());
GROUP BY
  c.ID,
  c.Name;

SQL 小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM