PDA

View Full Version : مشکل در نوشتن Query



baabi
چهارشنبه 20 فروردین 1382, 21:32 عصر
با سلام

خواهش میکنم این sql رو برای من حل کنید:

:table

dep
------
10
25
15-
12-



:query

dep | man
-------------
10 | 10
35 | 25
20 | 15-
8 | 12-


خواههههههههههههههههش مییییییییییییییییکنم

RezaBS
چهارشنبه 20 فروردین 1382, 23:29 عصر
ای فرزند اگر واقعا قصد یادگیری داشتید جواب قبلی من را دنبال میکردید ...
در SQL راهی که بشه به نتیجه مستقیم منظور نظر شما رسید وجود نداره. یک فیلد تک مثل کلید دارید که اینجا fldIndex هست، باقیشم فکر کن:



SELECT Table1.fldIndex, (select sum(dep) as sod from table1 as table1_1 where table1_1.fldIndex<=table1.fldIndex) as rem
FROM Table1
GROUP BY Table1.fldIndex;


برای اطمینان کامل این کد را چک کردم پس اگر جواب نگرفتید اشکال از سمت شماست...

baabi
جمعه 22 فروردین 1382, 09:37 صبح
با سلام
رضای بزرگوار
واقعا تو منو شرمنده کردی با جوابهات . واقعا ممنونم.
چرا من هدفم یادگیری هست. البته از اون بالاتر میخوام که استفاده کنم و بکار بگیرم. الان من اینکارو با استفاده از while و table انجام میدم.
اینکار خیلی از دستور nested select بهتره چون با استفاده از select تو در تو باید برای هر رکورد یک جستجو در تمام جدول انجام بدیم که واقعا وقت گیر خواهد بود . در حالی که من میخوام با استفاده از sql سرعت بیشتری داشته باشم. پس این راه مناسب نخواهد بود.

در ضمن در دستوراتی که برام نوشتی یک نکته رو فهمیدم و میتونم اونو در جاهای دیکه استفاده کنم‌( if) و باز هم تشکر میکنم.

baabi
چهارشنبه 27 فروردین 1382, 16:09 عصر
با سلام

1- معذرت میخوام که اینقدر دیر میام! راستش بیشتر مواقع ( چون سرعت من پایینه ) نمیتونم این سایتو بیارم.
2- در مورد دستوری که برای من نوشتید ‌: من این دستور select رو نتونستم اجرا کنم . من از bde query و dbisam query استفاده میکنم و هر کاری کردم select رو نتونستم در ردیف فیلد های انتخابیم بذارم.
3- اما در مورد nested select که نوشته بودم منظورم حالتی است که در قسمت where از select استفاده شود که البته حدس میزنم از نظر زمانی تفاوتی با کدی که شما گفتید نداشته باشد و اما نتایج گزارش گیری من:

تعداد رکورد-------------زمان
200-------------------0.531ثانیه
500------------------2.937 ثانیه
1000----------------13 ثانیه
2000----------------67 ثانیه

سیستم من celeron 1000 است که 256MB هم رم دارد.

متشکر

RezaBS
پنج شنبه 28 فروردین 1382, 23:28 عصر
دوست گرامی،
در مورد شماره 2: میشه بدونم بانک اطلاعاتی مربوطه چیه؟ و این جواب شما نشان دهنده این مساله هست که قبل از تست و براساس حدسیات نتیجه گرفتید! برای یک برنامه نویس این مثل سم هست.
در مورد شماره 3: خیلی دوست دارم بدونم اصطلاح nested select را در کجا دیدید!!؟ اما درباره زمانها، اگر با bde به این نتایج رسیدید که صد در صد الگوریتم ضعیفی استفاده شده و باید تغییر کنه، هر چند بهتره استفاده نکنید.
اما در مورد زمانها من کاری که در یکی از پروژه ها پیاده شد را برای شما مثال میزنم.
در حالت اول مانند شما با ado و bde کار شد، زمان اجرای عملیات برای تعداد حدود یک میلیون و دویست رکورد حدود 14 دقیقه بود (البته عملیات محاسباتی واقعا زیاد بود)
این عملیات با استفاده از روشی که برای شما نوشتم که ساده ترین روش میتونه باشه به حدود 12 ثانیه کاهش پیدا کرد.
با اعمال روشهای دیگری این زمان هم کاهش پیدا کرد.
اما نتیجه اینکه مطمئن باشید روی هوا چیزی اینجا نمینویسم، پس خواهش میکنم تست کنید بعد رد کنید.
اگر باز هم با پیاده سازی این روش در یک برنامه مشکل داشتید بفرمائید تا من یک برنامه نمونه براتون اینجا بنویسم.
موفق باشید...

baabi
شنبه 30 فروردین 1382, 22:41 عصر
با سلام

1- راستش من تنها کتابی رو که در زمینه sql دیدم یه کتاب انگلیسی بود ( sql in 21 days ) که اونم تو کتابخونه پالایشگاه دیدم ( بندر عباس ) و همینم خیلی واسه من و شهرم زیاده. nested select هم توی اون بود ( من فکر میکنم یعنی تو در تو - راستش این جا من لازم نیست چیزی رو که میگم درست باشه دلیلش هم ...! )
2- خواهش میکنم اینطور قضاوت نکنید. اگر دقت کرده باشید من چند روز بعد از آخرین جواب شما نتایج رو دادم چون میخواستم جوابهام از نظر وجدانی و عملی درست و دقیق باشند با اینکه حدود رو میدونستم. پس بابت همه راهنماییهاتون ممنونم اما یه بار دیگه خواهش میکنم این فکرو نکنید.
3- من یه جدول با database desktop ساختم که از نوع paradox 7 بود و این نتایج رو با TQuery گرفتم ( Delphi 6 ) .

4-اون sql ای که برای من نوشته بودید ( که دو select در هم داشت ) برای من این پیغام رو میداد:

کد sql روی Tquery
( میبخشی من بلد نیستم مثل شما code رو درست بنویسم 0 ها الکی هستند ):

select bed , (select sum(bed)as sbed) 000000
from accbde000000

خطا:
invalid use of keyword
Token: ) 000000
from
line number:1


در پایان قدر امکانات و شرایطتون رو بدووووووونید :wink:

RezaBS
یک شنبه 21 اردیبهشت 1382, 17:35 عصر
با سلام
دوست گرامی باید ببخشید اینقدر دیر جوابتونو مینویسم، جدا فرصتی نبود و فقط گاهی بعضی سوال و جوابها را میخواندم.
اما در مورد مساله شما که البته امیدوارم تا حالا خودتون حلش کرده باشید و این نوشته فقط جهت تکمیل بحث باشه، حق با شماست چون کد قبلی در وضعیتی که شما میخواستید کار نمیکرد.
همانطور که میدانید هر چند زبان SQL به عنوان زبان مشترک مطرح است ولی بعضی مواقع استثناء دارد.
در مورد مساله شما کدی که برای شما نوشته بودم برای Access کار میکرد و در حالت استفاده شما با وجود WHERE در پرانتز مربوط به جمع خطا میداد.
اما برای رفع مشکل شما مقداری وقت گذاشتم و به کد زیر رسیدم که مشترک است، امتحانش کنید:

SELECT DB1.Field1, SUM(DB1_1.Field2) AS DB1.Field3
FROM DB1, DB1 AS DB1_1
WHERE DB1_1.Field1<=DB1.Field1
GROUP BY DB1.Field1;
فکر کنم روابط مشخص باشند. Field3 نتیجه مورد نظر شماست. اگر مشکلی بود حتما بنویسید.
موفق باشید...