Click here to Skip to main content
15,918,211 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
i have Four table
SQL
tblUser(UserID PK,name)
tblPackage (PackageID  pk, PackageName)
tblPayment(PaymentID Pk,UserID Fk, PackageID FK,Payingdate,PaidAmount,RemainingBalance)
tblsubscription(subID pk, userID, packageID,PackageExpireDate, PackStartDate)


Here suppose in my tblpaymet i am adding the value
SQL
(1,1,1,2016-11-2,2000,8000),
(2,1,1,2016-11-3,3000,7000),
(3,1,1,2016-11-4,2000,8000)


and if same user take another package
SQL
(4,1,2,2016-11-1,5000,7000),
(5,1,2,2016-11-2,5000,7000),
(6,1,2,2016-11-3,5000,7000),


in this both statement i want to retrive the last record of each user by differentiate them packageID means in my example i want to retrive only paymentid(3,6) but using this query i am getting all record. so please help me to get the last record of each user

What I have tried:

SQL
select  users.UserID, users.Name, users.Contact, users.photos, pay.PaymentID, pay.Paying_date, pay.Payble, pay.Discount, pay.Total_Paid,p ay.Balance_Remain, pay.Payment_Mode, pay.Payment_Type, pay.Payment_Describtion, pack.PackageID, pack.Package_Name, pack.Package_Duration, pack.Package_Amount, sub.Package_Expire_Date, sub.Package_StartDate from tblUser as users 
	inner join tblPayment as pay 
	on users.UserID=pay.UserId
	left outer join tblPackages as pack
	on pack.PackageID = pay.PackageId
	inner join tblSubscription as sub 
	on users.UserID = sub.UID
Posted
Updated 3-Nov-16 4:36am
v2
Comments
Suvendu Shekhar Giri 3-Nov-16 9:54am    
..and what have you tried to get the last records?

Clue:

Try GROUP BY with HAVING
or ROW_NUMBER()

1 solution

Something like this should work:
SQL
WITH ctePayment As
(
    SELECT
        PaymentID,
        UserID,
        PackageID,
        Paying_date, 
        Payble,
        Discount, 
        Total_Paid,
        Balance_Remain, 
        Payment_Mode, 
        Payment_Type, 
        Payment_Description, 
        ROW_NUMBER() OVER (PARTITION BY UserID, PackageID ORDER BY Paying_date DESC) As RN
    FROM
        tblPayment
)
SELECT 
    users.UserID, 
    users.Name, 
    users.Contact, 
    users.photos, 
    pay.PaymentID, 
    pay.Paying_date, 
    pay.Payble,
    pay.Discount, 
    pay.Total_Paid,
    pay.Balance_Remain, 
    pay.Payment_Mode, 
    pay.Payment_Type, 
    pay.Payment_Description, 
    pack.PackageID, 
    pack.Package_Name,
    pack.Package_Duration, 
    pack.Package_Amount, 
    sub.Package_Expire_Date, 
    sub.Package_StartDate 
FROM
    tblUser As users 
    INNER JOIN ctePayment As pay 
    ON pay.UserId = users.UserID 
    And pay.RN = 1
    INNER JOIN tblSubscription as sub 
    ON sub.UID = users.UserID
    And sub.PackageID = pay.PackageUD
    INNER JOIN tblPackages As pack
    ON pack.PackageID = pay.PackageID
;
 
Share this answer
 
Comments
AZHAR SAYYAD 4-Nov-16 9:46am    
thanks this is work fine when i am using with same packagID if the package id is change maens if user has assign another package then the new package id is replace with older one

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900