如何解决计算视图中某些线的总和?
我有以下问题:
我有一个视图,其中包含ID,month_date,max_month_date和余额。我现在想做一个自我联接,将id与id进行比较,并将max_month_date与month_date进行比较。因此,仅将具有最大month_date的行写入新视图。 那是起点:
id month_date max_month_date balance
1 2020-01-12 2020-01-31 100
1 2020-01-16 2020-01-31 150
1 2020-01-31 2020-01-31 200
1 2020-02-03 2020-02-23 100
1 2020-02-23 2020-02-23 150
1 2020-02-23 2020-02-23 -150
因此我的加入是:
SELECT t.main_id,t.month_date,t.max_month_date,t.balance
FROM test_view t
INNER JOIN test_view s
ON t.main_id = s.main_id
AND t.month_date = s.max_month_date
问题是有些行具有相同的ID和相同的max_month_date。余额是不同的。因此,输出中写了太多行。
从理论上讲,我将必须总计所有具有相同ID和相同max_month_date的余额。 在上述情况下,这适用于最后两行:
id month_date max_month_date balance
1 2020-02-23 2020-02-23 0
然后,必须在主视图中删除重复的数据记录,并仅用构成余额总数的行填充。 像这样:
id month_date max_month_date balance
1 2020-01-12 2020-01-31 100
1 2020-01-16 2020-01-31 150
1 2020-01-31 2020-01-31 200
1 2020-02-03 2020-02-23 100
1 2020-02-23 2020-02-23 0
有人有什么主意可以帮助我吗?
预先感谢
解决方法
尝试以下操作。COUNT
窗口功能可确保将相同的值分组在一起,而不管其为负还是正。然后,如果计数> 1,则BALANCE
列按MAIN_ID,MONTH_DATE,MAX_MONTH_DATE
分组,否则BALANCE
。
WITH TEST_VIEW AS (
SELECT 1 MAIN_ID,CONVERT(DATETIME,'2020-01-12',102) AS MONTH_DATE,'2020-01-31',102) AS MAX_MONTH_DATE,100 AS balance UNION ALL
SELECT 1 MAIN_ID,'2020-01-16',150 AS balance UNION ALL
SELECT 1 MAIN_ID,200 AS balance UNION ALL
SELECT 1 MAIN_ID,'2020-02-03','2020-02-23',-150 AS balance
)
SELECT DISTINCT
T.MAIN_ID,T.MONTH_DATE,T.MAX_MONTH_DATE,CASE
WHEN BALC > 1
THEN
SUM (BALANCE)
OVER (PARTITION BY T.MAIN_ID,T.MAX_MONTH_DATE)
ELSE
BALANCE
END
SUMM
FROM (SELECT T.MAIN_ID,T.BALANCE,COUNT (*)
OVER (PARTITION BY T.MAIN_ID,ABS (T.BALANCE))
BALC
FROM TEST_VIEW T) T
,
尝试使用SQL DISTINCT
SELECT DISTINCT t.main_id,t.month_date,t.max_month_date,t.balance
FROM test_view t
INNER JOIN test_view s
ON t.main_id = s.main_id
AND t.month_date = s.max_month_date
,
您只需要一个WHERE
子句:
SELECT t.main_id,t.balance
FROM test_view t
WHERE t.month_date = t.max_month_date;
不需要JOIN
。
如果视图没有max_month_date
,则可以使用窗口函数来计算它:
SELECT t.main_id,t.balance
FROM (SELECT t.*,MAX(month_date) OVER (PARTITION BY main_id) as max_month_date
FROM test_view t
) t
WHERE t.month_date = t.max_month_date;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。