我的表有 6 列,ID、用戶名、地址、日期、型別和金額。
我想找到在日期 a 和 b 之間更改某個型別列的數量(int)的每個用戶。如果它是負數,我需要確切的差異,它必須顯示一個負數。我面臨的問題是資料庫中沒有唯一識別符號(在某些情況下,除了數量之外的所有內容都相同)。ID 是無用的,因為它只是一個自動增量。
我寫了這個宣告:
SELECT a.Username, a.Address, a.diff, a.Type
FROM (
SELECT Username, Address, Type, MAX(Amount)-MIN(amount)AS diff
FROM dbo.data
WHERE Date='date1' OR Date='date2'
GROUP BY Username, Address, Type
HAVING MAX(amount) - MIN(amount) > 0
) a
ORDER BY diff;
這個說法的問題是:
- 這個差異只是正數和
- 如果同一個日期有同一個用戶有不同數量的相同型別,它將輸出該差異,我只想看看日期之間是否存在差異。
我知道這個資料庫設計得很糟糕,但這就是這家公司擁有它的方式。我很感激任何意見。
樣本資料:
ID USERNAME ADDRESS TYPE AMOUNT DATE
0 JOHN street1 NKK 200 2022-05-22
1 ALEX street3 NKK 400 2022-05-22
2 MIKE street2 MKK 400 2022-05-22
3 MIKE street2 MKK 300 2022-05-22
4 MIKE street2 MLB 500 2022-05-22
5 JAKE street3 MLB 499 2022-05-22
6 JOHN street1 NKK 100 2022-05-23
7 ALEX street3 NKK 400 2022-05-23
8 MIKE street2 MKK 500 2022-05-23
9 MIKE street2 MKK 300 2022-05-23
10 MIKE street2 MLB 600 2022-05-23
11 JAKE street3 NKK 499 2022-05-23
輸出:
USERNAME STREET TYPE DIFF
JOHN street1 NKK -100
MIKE street2 MKK 100
MIKE street2 MLB 100
JAKE street3 MLB -499
JAKE street3 NKK 499
uj5u.com熱心網友回復:
我認為您只需要在兩個日期內有條件地匯總:
with amounts as (
select *,
Sum(case when DATE='20220523' then AMOUNT end) over(partition by USERNAME,ADDRESS,TYPE)
- Sum(case when DATE='20220522' then AMOUNT end) over(partition by USERNAME,ADDRESS,TYPE) as Diff
from data
where DATE in ('20220522','20220523')
)
select distinct USERNAME, ADDRESS, TYPE, Diff
from amounts
where Diff != 0;

見演示小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487003.html
上一篇:如何將字串列轉換為日期列
下一篇:將用戶添加到資料庫時的安全觸發器
