SQL-查找尚未支付帐户的时间

时间:2018-10-09 03:17:18

标签: sql-server tsql

我有下表:

+--------+------+---------+------------+
|   ID   | TEAM | WEEK_NO | Money_paid |
+--------+------+---------+------------+
| 112233 | AA   |  201801 |        100 |
| 112233 | BB   |  201801 |          0 |
| 112233 | BB   |  201802 |          0 |
| 112233 | BB   |  201803 |          0 |
| 454545 | AA   |  201801 |        100 |
| 658855 | BB   |  201802 |        100 |
| 658855 | BB   |  201802 |        100 |
| 112233 | BB   |  201809 |          0 |
+--------+------+---------+------------+ 

,我希望使用该规则的结果如下表所示 计算Money_paid相同的连续week_no.s。它是连续的顺序:

+--------+------+---------+------------+-------+
|   ID   | TEAM | WEEK_NO | Money_paid | Count |
+--------+------+---------+------------+-------+
| 112233 | AA   |  201801 |        100 |     1 |
| 112233 | BB   |  201801 |          0 |     3 |
| 112233 | BB   |  201802 |          0 |     3 |
| 112233 | BB   |  201803 |          0 |     3 |
| 454545 | AA   |  201801 |        100 |     1 |
| 658855 | BB   |  201802 |        100 |     1 |
| 112233 | BB   |  201809 |          0 |     1 |
+--------+------+---------+------------+-------+

到目前为止,我已经尝试了很多方法,但是没有一个方法能达到预期的结果。

select top 10 
    Concat(TEAM, ID) AS Concatbu_ac, count(*) 
from 
    (select 
         *,
         (row_number() over (order by week_no) -
          row_number() over (partition by Concat(team, ID) order by week_no)
         ) as group5
     from 
         table5) t
group by 
    group5, Concat(team, ID);

1 个答案:

答案 0 :(得分:0)

如果我的理解正确,您想根据ID和团队支付的金额来计算周数。这个想法是通过ID, Team, Money_Paid来计数记录组,然后通过唯一列进行自我连接。希望这能回答您的问题。

DECLARE @dataset TABLE (
    ID INT,
    Team VARCHAR(10),
    Week_No INT,
    Money_Paid INT
)

INSERT INTO @dataset SELECT 112233, 'AA', 201801, 100
INSERT INTO @dataset SELECT 112233, 'BB', 201801, 0
INSERT INTO @dataset SELECT 112233, 'BB', 201802, 0
INSERT INTO @dataset SELECT 112233, 'BB', 201803, 0
INSERT INTO @dataset SELECT 454545, 'AA', 201801, 100
INSERT INTO @dataset SELECT 658855, 'BB', 201802, 100 --duplicate
INSERT INTO @dataset SELECT 658855, 'BB', 201802, 100 --duplicate
INSERT INTO @dataset SELECT 112233, 'BB', 201809, 0

--week count
SELECT 
    ds.*,
    x.WeekCount
FROM @dataset ds
JOIN (
    SELECT 
        ID, 
        Team,
        COUNT(Week_No) AS WeekCount
    FROM @dataset
    GROUP BY ID, Team, Money_Paid
) x
ON ds.ID = x.ID
AND ds.Team = x.Team
ORDER BY ID, Team, Week_No

--week to date
SELECT 
    ds.*,
    COUNT(*) OVER (PARTITION BY ID, Team, Money_Paid ORDER BY ID, Team, Week_No) AS WeekToDate
FROM @dataset ds