View Full Version : یک کوئری
linux
دوشنبه 07 اسفند 1385, 20:17 عصر
ما دوتا جدول به شکل زیر داریم
UserTable
که این فیلدها را داره
UserID,name
CreditTable
که این فیلد ها دارد
ID,UserIDBuyer,UserIDSeler,Credit,Date
حالا می خواهیم کوئری درست کنیم که این فیلد ها را برگرداند
UserID,BuyedCredit,SoldCredit,RemainCredit
مثال هم به این شکل
userTabel
1,user1
2,user2
3,user3
creditTable
1,1,1,100,'2007/01/01'
2,1,2,150,'2007/01/02'
3,2,1,50,'2007/01/03'
qurey
user1,250,50,200
user2,50,0,50
ممنون میشم اگر کمک کنید
whitehat
دوشنبه 07 اسفند 1385, 21:10 عصر
اگر منظور شما را از Remain Ceredit درست متوجه شده باشم ، می توانید از Query زیر استفاده کنید.
SELECT
ISNULL(Buyers.UserIdBuyer,Sellers.UserIDSeler) AS UserID
,ISNULL(BuyCredit,0) AS BuyCeredit
,ISNULL(SellCredit,0) As SellCeredit
,(ISNULL(BuyCredit,0)-ISNULL(SellCredit,0)) As RemainCeredit
FROM
(SELECT UserIdBuyer,SUM(Credit) As BuyCredit FROM dbo.creditTable
GROUP BY UserIdBuyer
) As Buyers
FULL OUTER JOIN
(SELECT UserIDSeler,SUM(Credit) As SellCredit FROM dbo.creditTable
GROUP BY UserIDSeler) As Sellers
ON Buyers.UserIdBuyer=Sellers.UserIDSeler
linux
دوشنبه 07 اسفند 1385, 23:08 عصر
اگر منظور شما را از Remain Ceredit درست متوجه شده باشم ، می توانید از Query زیر استفاده کنید.
SELECT
ISNULL(Buyers.UserIdBuyer,Sellers.UserIDSeler) AS UserID
,ISNULL(BuyCredit,0) AS BuyCeredit
,ISNULL(SellCredit,0) As SellCeredit
,(ISNULL(BuyCredit,0)-ISNULL(SellCredit,0)) As RemainCeredit
FROM
(SELECT UserIdBuyer,SUM(Credit) As BuyCredit FROM dbo.creditTable
GROUP BY UserIdBuyer
) As Buyers
FULL OUTER JOIN
(SELECT UserIDSeler,SUM(Credit) As SellCredit FROM dbo.creditTable
GROUP BY UserIDSeler) As Sellers
ON Buyers.UserIdBuyer=Sellers.UserIDSeler
ممنون ولی بجای userid می خوام username را برگردانم
linux
سه شنبه 08 اسفند 1385, 00:43 صبح
مثال هم به این شکل
userTabel
1,user1
2,user2
3,user3
creditTable
1,1,1,100,'2007/01/01'
2,1,2,150,'2007/01/02'
3,2,1,50,'2007/01/03'
یک کوئری دیگه هم احتیاج دارم
برای یک buyerID مثلا 1 این کوئری را می خواهم
تاریخ،خرید،فروش،مانده
'2007/01/01' , 100 , 0, 100
'2007/01/02' , 150 ,0 , 250
'2007/01/03' ,0 , 50 , 200
whitehat
سه شنبه 08 اسفند 1385, 09:15 صبح
ممنون ولی بجای userid می خوام username را برگردانممی توانید با جدول UserName ها را با Query قبل Join کنید
Select * From
(SELECT
ISNULL(Buyers.UserIdBuyer,Sellers.UserIDSeler) AS UserID
,ISNULL(BuyCredit,0) AS BuyCeredit
,ISNULL(SellCredit,0) As SellCeredit
,(ISNULL(BuyCredit,0)-ISNULL(SellCredit,0)) As RemainCeredit
FROM
(SELECT UserIdBuyer,SUM(Credit) As BuyCredit FROM dbo.creditTable
GROUP BY UserIdBuyer
) As Buyers
FULL OUTER JOIN
(SELECT UserIDSeler,SUM(Credit) As SellCredit FROM dbo.creditTable
GROUP BY UserIDSeler) As Sellers
ON Buyers.UserIdBuyer=Sellers.UserIDSeler) AS MyCereditTable
INNER JOIN
userTabel
ON userTabel1.UserID=MyCereditTable.UserID
باید به این نکته توجه کنید که برای این Query می توانید از Union نیز استفاده کنید(در صورتیکه نخواهید از ISNULL استفاده کنید)
whitehat
سه شنبه 08 اسفند 1385, 09:54 صبح
یک کوئری دیگه هم احتیاج دارم
برای یک buyerID مثلا 1 این کوئری را می خواهم
تاریخ،خرید،فروش،مانده
'2007/01/01' , 100 , 0, 100
'2007/01/02' , 150 ,0 , 250
'2007/01/03' ,0 , 50 , 200این Query را هم می توانید با استفاده از Union بنویسید
SELECT UserIdBuyer,Credit AS BuyCredit,0 As SellCeredit,Date
FROM dbo.creditTable
Where UserIdBuyer=@InputId
UNION ALL
SELECT UserIDSeler,0 AS BuyCredit,Credit As SellCeredit,Date
FROM dbo.creditTable
Where UserIDSeler=@InputId
برای بدست آوردن Username مانند Query قبلی می توانید Join کنید.
موفق باشید
linux
سه شنبه 08 اسفند 1385, 13:06 عصر
این Query را هم می توانید با استفاده از Union بنویسید
SELECT UserIdBuyer,Credit AS BuyCredit,0 As SellCeredit,Date
FROM dbo.creditTable
Where UserIdBuyer=@InputId
UNION ALL
SELECT UserIDSeler,0 AS BuyCredit,Credit As SellCeredit,Date
FROM dbo.creditTable
Where UserIDSeler=@InputId
برای بدست آوردن Username مانند Query قبلی می توانید Join کنید.
موفق باشید
ستون آخر که مانده را محاسبه می کند را هم احتیاج دارم
whitehat
سه شنبه 08 اسفند 1385, 14:05 عصر
ستون آخر که مانده را محاسبه می کند را هم احتیاج دارمستون آخر که برابر همان Ceredit در همان سطر میشه !
SELECT
UserIdBuyer
,Credit AS BuyCredit
,0 As SellCeredit
,Credit As RemainCeredit
,Date
FROM creditTable
Where UserIdBuyer=@InputId
UNION ALL
SELECT
UserIDSeler
,0 AS BuyCredit
,Credit As SellCeredit
,Credit As RemainCeredit
,Date
FROM creditTable
Where UserIDSeler=@InputId
linux
سه شنبه 08 اسفند 1385, 15:57 عصر
ستون آخر که برابر همان Ceredit در همان سطر میشه !
SELECT
UserIdBuyer
,Credit AS BuyCredit
,0 As SellCeredit
,Credit As RemainCeredit
,Date
FROM creditTable
Where UserIdBuyer=@InputId
UNION ALL
SELECT
UserIDSeler
,0 AS BuyCredit
,Credit As SellCeredit
,Credit As RemainCeredit
,Date
FROM creditTable
Where UserIDSeler=@InputId
از اینکه لطف می کنی وقت میگذاری و جواب می دهی خیلی ممنون.
برای یک buyerID مثلا 1 این کوئری را می خواهم
تاریخ،خرید،فروش،مانده
'2007/01/01' , 100 , 0, 100
'2007/01/02' , 150 ,0 , 250
'2007/01/03' ,0 , 50 , 200
این کوئری را خوب نگاه کنید
مانده برابر هست با مانده سطر قبل + خرید - فروش
مثلا برای شروع مانده 0 هست که با 100 جمع میشه از 0 کم میشه مساوی 100
برای سطر دوم این مقدار 100 هست که با 150 جمع میشه و از 0 کم میشه میشه 250
برای سطر سوم این مقدار 250 هست که با 0 جمع میشه و از 50 کم میشه برابر 200 که آخرین سطر مانده نهایی را به ما میده
linux
چهارشنبه 09 اسفند 1385, 08:42 صبح
راه حل نداشت؟
whitehat
چهارشنبه 09 اسفند 1385, 11:05 صبح
راه حل نداشت؟
این کار راه حل برنامه نویسی داره ، یا باید از Cursor استفاده کنید.متاسفانه راه حلی با استفاده از Query ها هنوز پیدا نکردم . شاید با استفاده از CTE یا Query بازگشتی بشه این نوع اسناد مالی را بدست آورد. امتحان می کنم خبرشو می دهم :)
AminSobati
جمعه 11 اسفند 1385, 21:53 عصر
من این کد روی برای موضوع دیگه ای نوشتم ولی فکر میکنم منطقش برای شما هم قابل استفاده باشه. اول این جدول رو بسازید تا اصل Query رو باهاش اجرا کنیم:
create table tx(c1 int identity primary key, c2 int)
insert tx(c2) select 7
insert tx(c2) select 4
insert tx(c2) select 2
insert tx(c2) select 5
در جدول tx قصد داریم همیشه مقدار فیلد c2 رو با مقدار ردیف قبل از خودش جمع کنیم. یعنی برای رکورد اول، عدد 7 چون قبلش عددی وجود نداره، با صفر جمع میشه و ستون جدید (acc) حاصل برابره با 7. در رکورد بعد، عدد 4 با 7 جمع میشه که 11 بدست میاد، رکورد بعد 2 با 11 جمع میشه و الی آخر...
declare @t1 table (c1 int primary key,c2 int,acc int)
declare @acc int
set @acc=0
declare @start int
select @start=min(c1) from tx
while 1=1
begin
insert @t1 select c1,c2,c2+@acc from tx where c1=@start
select @start=min(c1) from tx where c1>@start
if @start is null break
select @acc=acc from @t1 where c1=(select max(c1) from @t1)
end
select * from @t1
فکر میکنم از این روش میتونین استفاده کنین و مثلا جایی که باید از مجموع اعداد کسر کنین، مثل فروش، عددش رو در منفی یک ضرب کنید تا در جمع بعدی کسر انجام بشه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.