אפיון תשלומים זהים או שונים

קיטלוג לקוחות עם סטטוס תשלומים זהה או לפחות אחד שונה

בסיסי
Published

September 19, 2023

ברוכים הבאים לתרגיל השני!

הדאטה

בטבלה למטה ניתן לראות פירוט תשלומים של יוזרים:

SELECT TOP 10 *
FROM payments_ag_2;
Displaying records 1 - 10
user_id date status amount
1 2023-06-01 Load 234
1 2023-06-14 Cancel 42
1 2023-06-16 Load 52
1 2023-06-22 Load 6
1 2023-06-23 Load 36
1 2023-06-24 Pending 74
2 2023-06-03 Load 58
2 2023-06-05 Load 33
2 2023-06-09 Load 65
2 2023-06-10 Load 74

שאלה

עבור כל יוזר החזר טבלה עם מספר התשלומים שהוא קיבל, עמודה המציינת האם כל התשלומים שהוא קיבל הם עם סטטוס ‘Load’ (1 כל התשלומים עם הסטטוס הזה, 0 לא), האם מספר התשלומים שנטענו היה גדול ממספר התשלומים שבוטלו (1 כן, 0 לא) והאם יש לו לפחות תשלום אחד שהוא ‘Pending’ (1 כן, 0 לא)

בהצלחה!

נסו בעצמכם

אונליין

נסו בחלון טקסט למטה (SQLite):

-- EDIT THIS QUERY:
SELECT *
FROM payments_ag_2
LIMIT 10;

נסו על המחשב שלכם

הצג קוד ליצירת טבלה
DROP table if exists payments_ag_2;


CREATE TABLE payments_ag_2
    ([user_id] int, [date] date, [status] varchar(7), [amount] int)
;
    
INSERT INTO payments_ag_2
    ([user_id], [date], [status], [amount])
VALUES
    (1, '2023-06-01', 'Load', 234),
    (1, '2023-06-14', 'Cancel', 42),
    (1, '2023-06-16', 'Load', 52),
    (1, '2023-06-22', 'Load', 6),
    (1, '2023-06-23', 'Load', 36),
    (1, '2023-06-24', 'Pending', 74),
    (2, '2023-06-03', 'Load', 58),
    (2, '2023-06-05', 'Load', 33),
    (2, '2023-06-09', 'Load', 65),
    (2, '2023-06-10', 'Load', 74),
    (2, '2023-06-14', 'Load', 98),
    (2, '2023-06-18', 'Load', 14),
    (3, '2023-06-01', 'Cancel', 52),
    (3, '2023-06-04', 'Cancel', 5),
    (3, '2023-06-07', 'Pending', 99),
    (4, '2023-06-09', 'Load', 100),
    (4, '2023-06-10', 'Cancel', 15),
    (5, '2023-06-15', 'Load', 20),
    (6, '2023-06-16', 'Pending', 21),
    (6, '2023-06-16', 'Load', 42)
;

תשובה

סרטון הסבר

פלט

הצג קוד
SELECT USER_ID,
    COUNT(*) AS N_PAYMENTS,
    CASE WHEN SUM(CASE WHEN STATUS = 'Load' THEN 1 ELSE 0 END) = COUNT(*) THEN 1 ELSE 0 END AS ALL_LOADED,
    CASE WHEN COUNT(CASE WHEN STATUS = 'Load' THEN 1 END) > COUNT(CASE WHEN STATUS = 'Cancel' THEN 1 END) THEN 1 ELSE 0 END AS more_loaded_than_failed,
    MAX(CASE WHEN STATUS = 'Pending' THEN 1 ELSE 0 END) AS HAS_PENDING_PAYMENT
FROM payments_ag_2
GROUP BY USER_ID
6 records
USER_ID N_PAYMENTS ALL_LOADED more_loaded_than_failed HAS_PENDING_PAYMENT
1 6 0 1 1
2 6 1 1 0
3 3 0 0 1
4 2 0 0 0
5 1 1 1 0
6 2 0 1 1