View Full Version : سوال: نحوه select كردن جدول
mgh64120
دوشنبه 20 مهر 1388, 20:51 عصر
با عرض و خسته نباشيد
من يه جدول به نام A دارم كه يه فيلد عددي به نام B داره كه اعداد 1 تا 10 توش ذخيره شده. حالا ميخوام يك View درست كنم كه ركوردهايي رو نشون بده كه جمعشون برابر با عدد X باشه!
توضيح نمايشي:
جدول:
A : 1,2,3,4,5,6,7,8,9,10
ويوو :
X = 8 =>> View = 1,2,3,2
در اينجا ركورد آخر ويوو كه 2 است در واقع همان ركورد 4 در جدول A است ولي چون مقدار درخواستي ما(X) برابر 8 است پس فقط بايد 2 تا از آن نمايش داده شود.
با عرض پوزش نتونستم از اين بهتر توضيخ بدم. در صورت لزوم بگين تا اونو اصلاح كنم.
:ناراحت::افسرده::گریه:
mgh64120
دوشنبه 20 مهر 1388, 23:04 عصر
:متعجب::ناراحت::افسرده::گریه:
محمد سلیم آبادی
سه شنبه 21 مهر 1388, 04:04 صبح
سلام،
Query زیر دقیقا همان چیزی است که می خواهین ولی سطر آخر رو شرمنده.
declare @n int set @n=8
declare @a table ( i int )
insert into @a
select rowID as i
from
(
select *,rowID=ROW_NUMBER()
over (order by id)
from sysobjects
)d
where rowID<11
select * from @a
/*
i
-----------
1
2
3
4
5
6
7
8
9
10
*/
select * from @a
where (i*i)+i <= 2*@n
--1+2+3+...+n=(n/2)*(n+1)
/*
i
-----------
1
2
3
*/
mgh64120
چهارشنبه 22 مهر 1388, 09:55 صبح
با تشكر از توجهتون دوست عزيز mSalim.
منظور من اينجا تعداد ركوردهايي است كه جمع آنها برابر عدد X باشه. نه اينكه بدانم مقدار آخرين ركورد چند است و اون رو where rowID<11 قرار دهم .
:ناراحت::افسرده::گریه:
محمد سلیم آبادی
چهارشنبه 22 مهر 1388, 11:04 صبح
خوب به جواب نگاه نکردین. اول یک متغیر جدولی ایجاد کردم و اعداد 1 تا 10 را در آن درج کردم (Wherer rowID<11) سپس یک Query روی این جدول گرفتم به صورت زیر:
select * from @a
where (i*i)+i <= 2*@n
که مثلا اگر عدد مورد نظر ما (X) پانزده باشد تا 5 سطر از جدول رو بر می گردونه (سطرهای 1 تا 5)
مساله نیازی به نوشتن Query پیچیدهی نداره فقط با یک اثبات ریاضی ساده زیر به جواب می رسیم:
1+2+3+4=1+4 + 2+3= 5*2
اگر 4 رو n در نظر بگیریم مجموع اعداد 1 تا n برابر خواهد بود با
n+1 * n/2
mgh64120
شنبه 25 مهر 1388, 18:01 عصر
دوست عزيز mSalim
مثالي كه زدم باعث شد مسئله رو اشتباه بفهميد. من براي راحتي كار اعداد 1 تا 10 رو مثال كردم.
حال اگر اطلاعات جدول A اعداد بهم ريخته باشه چطور؟
A: 5,9,12,6,1,33,24,7,-2
محمد سلیم آبادی
شنبه 25 مهر 1388, 18:22 عصر
اگر به جدول A یک کلید اضافه کنین که مقادیر افزایشی در آن درج شود مثلا 1 ، 4 ، 6 ، 7 ... فکر کنم با Query شبیه به کد زیر این کار امکان پذیر باشد.
Select * From A aa
Where (select SUM(a) From A where PK<=aa.PK)<=X
محمد سلیم آبادی
شنبه 25 مهر 1388, 19:58 عصر
این کد زیر را اجرا کنین.
X را 20 در نظر گرفتم و داده های جدول زیر دقیقا داده های مورد نظر شما هستند.
SET NOCOUNT ON
Declare @A Table
(
PK int Primary Key,
A int
)
--5,9,12,6,1,33,24,7,-2
Insert Into @A Values (1, 5)
Insert Into @A Values (2, 9)
Insert Into @A Values (3, 12)
Insert Into @A Values (4, 6)
Insert Into @A Values (5, 1)
Insert Into @A Values (6, 33)
Insert Into @A Values (7, 24)
Insert Into @A Values (8, 7)
Insert Into @A Values (9, -2)
--THE MASILM QUERY!
Select A From @A aa
Where (select SUM(a) From @A where PK<=aa.PK) <= 20
Union All
Select 20-(select sum(a) from (Select * From @A aa
Where (select SUM(a) From @A where PK<=aa.PK) <= 20)d)
--Result
/*
A
-----------
5
9
6
*/
محمد سلیم آبادی
یک شنبه 26 مهر 1388, 13:24 عصر
اگر جدولت کلید یکتا هم نداشته باشد با کوئری زیر به خواستتون می رسید (حتی باقی مانده هم محاسبه می شود)
SET NOCOUNT ON
Declare @A Table
(
A int
)
--5,9,12,6,1,33,24,7,-2
Insert Into @A
Select (5) Union All Select (9) Union All
Select (12) Union All Select (6) Union All
Select (1) Union All Select (33) Union All
Select (24) Union All Select (7) Union All
Select (-2)
Declare @Helpful Table
(RowID int, A Int)
Declare @i Int,
@X int
Set @X=26
Insert Into @Helpful
Select RowID=ROW_NUMBER() OVER(ORDER BY rand()), *
From @A
Select @i=@X-(Select Sum(A) From (Select A From @Helpful h
Where (select SUM(A) From @Helpful where RowID<=h.RowID) <= @X)D)
Select A From @Helpful h
Where (select SUM(A) From @Helpful where RowID<=h.RowID) <= @X
Union All (
Select CASE @i When 0 Then Null Else @i End
Except Select Null)
mgh64120
یک شنبه 26 مهر 1388, 20:17 عصر
دوست عزيز آقاي محمد سليم آبادي
من شرمنده شما كه اين قدر وقتتون در اختيار من قرار داديد.:خجالت:
يه مشكل ديگه
من از SqlServer 2000 استفاده مي كنم و از Row_Number و يا اگه دستور ديگه اي هم هست نمي تونم
استفاده كنم. اگه ممكنه(شرمنده) اون قسمت كد رو برام تبديل كنيد.
با تشكر
:بوس:
محمد سلیم آبادی
یک شنبه 26 مهر 1388, 20:21 عصر
امکان دارد بگید که هدفتان از این کار چیه؟
و آیا این مشکل یا نیاز وجود خارجی دارد یا اینکه این موضوع تبدیل به یک معما شده است؟
mgh64120
یک شنبه 26 مهر 1388, 20:27 عصر
من اين رو براي محاسبه سود و زيان ميخواستم كه تاپيك اون رو ارائه كردم ولي كسي پاسخ نداد.
اگه ميشه يه نگاهي بيندازيد
ادرس تاپيك سود و زيان
http://barnamenevis.org/forum/showthread.php?t=184315
محمد سلیم آبادی
یک شنبه 26 مهر 1388, 21:16 عصر
اگر از تابع Row_Number نمی توانین استفاده کنین باید یک ستون کلید اولیه در جدول ایجاد کنین.
اگر این پروژه ی مثلا آزمایشی یا دانشجویی یا ... هست که هیچی اگر پروژه مربوط به یک کارفرما می شه بهتره ابتدا مشخص کنید که آنها چه موجودیت هایی را می خواهند ذخیره کنند و چه گزارش گیری هایی دارند.
مثلا یک جدول برای لیست کالا ها و تعداد یک جدول برای ثبت خرید و فروش و ...
ابتدا باید بانک درست طبق نیاز مشتری طراحی شود و سپس گزارش گیری صورت بگیرد.
بهتره یک پروژه ی انباری داری رو الگو در نظر بگیرین و ببینین چه کاری انجام داده.
mgh64120
یک شنبه 26 مهر 1388, 21:49 عصر
دوست عزيز محمد سليم آبادي
ممنون از توجهات بي دريغتان
ميخواستم بدونم كدي نوشته بوديد رو نميشه به Sql2000 تبديل كنيد:متفکر:
محمد سلیم آبادی
یک شنبه 26 مهر 1388, 22:39 عصر
کوئری که در پست شماره 8 قرار دادم بدون استفاده از دستور خاصی است.
در این تاپیک هم شیوه های مختلف Ranking اومده.
http://www.barnamenevis.org/forum/showthread.php?t=184144
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.