PDA

View Full Version : استخراج چند فیلد از چند جدول



mortezahbh
پنج شنبه 22 آبان 1393, 07:24 صبح
با سلام

بنده میخوام اطلاعات 3 تا جدول رو داخل یک گرید نمایش بدم

جدول 1 (دانشجو) نام و نام خانوادگی و ...
جدول 2 (بدهی ها) جمع بدهی
جدول 3 (پرداختی ها)جمع پرداختی ها

و در آخر بصورت زیر قابل نمایش باشه.
توجه داشته باشید که مقادیر جمع بدهی و پرداختی در جدول وجود ندارد و باید از دستور Sum استفاده شود.


http://barnamenevis.org/attachment.php?attachmentid=125578&d=1415811831

ممنون میشم راهنمایی کنید

parvizwpf
پنج شنبه 22 آبان 1393, 08:49 صبح
یه چیزی تو این مایه ها امیدوارم جواب بده:
select a,name,a.mell,a.code,sum(b.bedehi),sum(c.pardakhti ) from daneshju a join bedehi b on a.id=b.daneshjuid join pardakhti c on a.id=c.daneshjuid

sajadsobh
پنج شنبه 22 آبان 1393, 09:16 صبح
فکر کنم این جواب بده. البته با این جداولی که شما طرح کردید:


SELECT Daneshjoo.ID, Daneshjoo.Name, Daneshjoo.Code, SUM(Bedehi.Mablagh) as Bedehi, SUM(Pardakhti.Mablagh) as Pardakhti
FROM Daneshjoo INNER JOIN Bedehi on Daneshjoo.ID = Bedehi.ID INNER JOIN Pardakhti on Daneshjoo.ID = Pardakhti.ID
GROUP BY Daneshjoo.ID, Daneshjoo.Name, Daneshjoo.CodeMelli
ORDER BY ID

mortezahbh
پنج شنبه 22 آبان 1393, 16:53 عصر
با تشکر از لطف شما دوستان

ببینید من کد رو به اینصورت برای خودم تغییر دادم



SELECT students.ID, students.fName, students.lName, students.National_Num, students.stunum, SUM(Debts.price) as Bedehi, SUM(Receipts.price) as Pardakhti
FROM students INNER JOIN Debts on students.ID = Debts.student_id INNER JOIN Receipts on students.ID = Receipts.student_id


اما با این اخطار مواجه میشم

125595

مشکل کجاس؟؟؟؟؟

درضمن دیتا بیسم اکسس است .

ممنون

sajadsobh
پنج شنبه 22 آبان 1393, 17:29 عصر
شما واسه جداول Debts و Receipts کلید خارجی تعریف کردین؟
بعدشم وقتی که توابع aggregate (مثل SUM) رو بکار می برید باید از دستور Group By استفاده کنید.

mortezahbh
پنج شنبه 22 آبان 1393, 18:16 عصر
شما واسه جداول Debts و Receipts کلید خارجی تعریف کردین؟
بعدشم وقتی که توابع aggregate (مثل SUM) رو بکار می برید باید از دستور Group By استفاده کنید.

همین فیلد student_id در جداول Debts و Receipts کلید خارجی هستند دیگه


دستور
Group By
رو هم اضافه کردم باز هم همین اخطار رو میده

دلیل اینکه باید از
دستور
Group By
استفاده کنم چیه؟؟؟

ممنون:قلب:

sajadsobh
پنج شنبه 22 آبان 1393, 18:20 عصر
باید بنویسید:

group by students.ID, students.fName, students.lName, students.National_Num, students.stunum

همینکار رو کردید؟

sajadsobh
پنج شنبه 22 آبان 1393, 18:24 عصر
شما خودتون یکم فکر کنید! تابع SUM رو نوشتید که چی رو جمع کنه؟
Group By میاد رکورد های فیلدتون رو براساس اونچه که جلوش قرار میدید دسته بندی میکنه و بعد تابع sum رو اعمال میکنه. یعنی اول دسته بندی رکوردها براساس ID دانشجوها انجام میشه و بعد جمع بدهی دانشجوها اعمال میشه. میشه گفت هر مقدار که در ستون sum قرار میگیره جمع مثلاً بدهی های دانشجویی هست که IDش فلان مقداره!!

mortezahbh
پنج شنبه 22 آبان 1393, 18:39 عصر
باید بنویسید:

group by students.ID, students.fName, students.lName, students.National_Num, students.stunum

همینکار رو کردید؟

بله دوست من همینو نوشتم



SELECT students.ID, students.fName, students.lName, SUM(Receipts.price) as Padakhti, SUM(Debts.price) as Bedehi


FROM students INNER JOIN Debts on students.id = Debts.student_id INNER JOIN Receipts on students.id = Receipts.student_id


GROUP BY students.ID, students.fName, students.lName, students.National_Num, students.stunum


ORDER BY ID


این هم ریلیشن اکسسم

125600

mortezahbh
پنج شنبه 22 آبان 1393, 18:41 عصر
وقتی به این دستور تغییرش میدم خروجی داره و مشکلی نداره



SELECT students.ID, students.fName, students.lName, SUM(Debts.price) as Bedehi


FROM students INNER JOIN Debts on students.id = Debts.student_id


GROUP BY students.ID, students.fName, students.lName, students.National_Num, students.stunum






اما دیگه جمع پرداختی ها رو ندارم

sajadsobh
پنج شنبه 22 آبان 1393, 19:05 عصر
به جای INNER JOIN از LEFT OUTER JOIN ببینین جواب میده؟!

sajadsobh
پنج شنبه 22 آبان 1393, 19:09 عصر
از پرانتز استفاده کنین بینین با INNER JOIN جواب میده؟

SELECT students.ID, students.fName, students.lName, SUM(Receipts.price) as Padakhti, SUM(Debts.price) as Bedehi
FROM (students INNER JOIN Debts on students.id = Debts.student_id) INNER JOIN Receipts on students.id = Receipts.student_id
GROUP BY students.ID, students.fName, students.lName, students.National_Num, students.stunum
ORDER BY ID

mortezahbh
پنج شنبه 22 آبان 1393, 19:12 عصر
ن متاسفانه :( باز هم نشد :(

چه احتمالاتی هس که این مشکل بوجود میاد؟؟

به فیلد های دیتا بیس ربطی نداره؟؟؟

mortezahbh
پنج شنبه 22 آبان 1393, 19:18 عصر
از پرانتز استفاده کنین بینین با INNER JOIN جواب میده؟

SELECT students.ID, students.fName, students.lName, SUM(Receipts.price) as Padakhti, SUM(Debts.price) as Bedehi
FROM (students INNER JOIN Debts on students.id = Debts.student_id) INNER JOIN Receipts on students.id = Receipts.student_id
GROUP BY students.ID, students.fName, students.lName, students.National_Num, students.stunum
ORDER BY ID

مرررررررررسی درست شد :) :تشویق:

چه نکته جالبی بود :متفکر: فکر نمیکردم پردانتز توی دستورات SQl اینقدر تاثیر گذار باشه

واسه قسمت ORDER BY ID این اخطار رو میداد

125606
که کلا پاکش کردم درست شد

واقعا ممنونم :)

sajadsobh
پنج شنبه 22 آبان 1393, 19:24 عصر
توی اکسس اینجور اشکالات هست وگرنه توی sql server من امتحان کردم این مشکل نبود که خدا رو شکر با پرانتز حل شد. خب این الان منظورش اینه که فیلد ID در چند جدول دارید و باید مشخص بشه که منظور شما چیه. باید از ORDER BY Students.ID استفاده کنین.

mortezahbh
پنج شنبه 22 آبان 1393, 19:42 عصر
خیلی خیلی ممنون از لطفتون :لبخندساده:

فقط یک مورد رو متوجه شدم، اینکه اگه دانشجو پرداختی نداشته باشه یعنی در جدول پرداختی ها سطری با ID یکسان دو جدول دیگه پیدا نکنه کلا نمایشش نمیده

من میخوام اگه هیچ پرداختی نداشت اطلاعات و بدهی رو نمایش بده و پرداختی رو صفر قرار بده

sajadsobh
پنج شنبه 22 آبان 1393, 23:40 عصر
خواهش میکنم.
به جای INNER JOIN از LEFT OUTER JOIN استفاده کنین. اینجوری اگه پرداختی یا بدهی هم نداشته باشن مقدار NULL برمیگردونه.

mortezahbh
جمعه 23 آبان 1393, 12:03 عصر
ممنون از لطفتون :قلب:

یک مشکل دیگه پیش اود باز :ناراحت:

موقعی که یک دانشجو بعنوان مثال 3 بدهی با عنوان متفاوت داره و با دستور بالا جمع اونها محاسبه میشه و بعد جمع پرداختی ها رو هم محاسبه میکنه و پرداختی های آن یکی میباشد
میاد به تعداد بدهی ها این مقدار رو دوباره جمع میزنه

یعنی مقدار پرداختی 3 برابر میشه.

* اینم مقادیر جداول



Debts



ID

student_id

title

debt_date

price



2

40

شهریه ثابت

1393/07/01

$3,900,000.00



3

40

سرانه فرهنگی

1393/07/01

$350,000.00



4

40

15% حق نظارت

1393/07/01

$585,000.00



5

40

شهریه متغیر

1393/07/01

$5,400,000.00



6

41

شهریه ثابت

1393/08/21

$3,900,000.00



7

41

سرانه فرهنگی

1393/07/01

$350,000.00



8

41

15% حق نظارت

1393/08/21

$585,000.00





Receipts
ID
student_id
debt_id
num
type
date_Received
price
for


1
40
4
45645
فیش
1393/08/19
$585,000.00
15% حق نظارت



و خروجی اون به این صورت است

125620

sajadsobh
شنبه 24 آبان 1393, 17:59 عصر
آقا الان من به این پی بردم که پیوند بین جداول اشتباه ست. الان تازه فهمیدم شما جی میخواین.

sajadsobh
شنبه 24 آبان 1393, 18:53 عصر
من یه دستور تودر تو می نویسم ببین جواب میده؟
اگه جواب داد و متوجه نشدین بگین توضیح بدم.


SELECT t1.ID, t1.name, SUM(t1.Bedehi) as Bedehi, SUM(t2.Padakhti) as Padakhti
FROM (
SELECT students.ID, students.name, SUM(Debts.price) as Bedehi
FROM students LEFT JOIN Debts on students.ID = Debts.student_id
GROUP BY students.ID, students.name) as t1
LEFT JOIN
(SELECT students.ID, students.name, SUM(Receipts.price) as Padakhti
FROM students LEFT JOIN Receipts on students.ID = Receipts.student_id
GROUP BY students.ID, students.name) as t2
on t1.ID = t2.ID
GROUP BY t1.ID, t1.name
ORDER BY t1.ID

mortezahbh
شنبه 24 آبان 1393, 20:32 عصر
من یه دستور تودر تو می نویسم ببین جواب میده؟
اگه جواب داد و متوجه نشدین بگین توضیح بدم.


SELECT t1.ID, t1.name, SUM(t1.Bedehi) as Bedehi, SUM(t2.Padakhti) as Padakhti
FROM (
SELECT students.ID, students.name, SUM(Debts.price) as Bedehi
FROM students LEFT JOIN Debts on students.ID = Debts.student_id
GROUP BY students.ID, students.name) as t1
LEFT JOIN
(SELECT students.ID, students.name, SUM(Receipts.price) as Padakhti
FROM students LEFT JOIN Receipts on students.ID = Receipts.student_id
GROUP BY students.ID, students.name) as t2
on t1.ID = t2.ID
GROUP BY t1.ID, t1.name
ORDER BY t1.ID

واقعا ممنونم بابت پیگیریتون

ببینید من کد رو به این صورت تغییر دادم



SELECT students.ID, students.FName, students.LName,SUM(Debts.price) as Bedehi, SUM(Receipts.price) as Pardakhti
FROM ( SELECT students.ID, students.FName, SUM(Debts.price) as Bedehi
FROM students LEFT JOIN Debts on students.ID = Debts.student_id
GROUP BY students.ID, students.FName) as students
LEFT JOIN
(SELECT students.ID, students.FName, SUM(Receipts.price) as Padakhti
FROM students LEFT JOIN Receipts on students.ID = Receipts.student_id
GROUP BY students.ID, students.FName) as Debts
on students.ID, = Debts.student_id
GROUP BY students.ID, students.FName
ORDER BY students.ID



حالا نمیدونم درسته یا نه

این اخطار رو داد

Syntax error in FROM clause

sajadsobh
شنبه 24 آبان 1393, 20:50 عصر
students.ID, students.FName, students.LName
شما باید این فیلدها رو توی همه Selectها بیارید. در آخر جلوی همه Group BYها هم بیارید.
ولی احتمالاً کوئری های ساده تر از این میشه فکر کنم ایجاد کرد یکم کار کنین خودتون دستتون میاد.
شما الان students.LName رو از کجای این دستور میخواین در بیارین که؟! :متفکر:

mortezahbh
شنبه 24 آبان 1393, 21:11 عصر
students.ID, students.FName, students.LName
شما باید این فیلدها رو توی همه Selectها بیارید. در آخر جلوی همه Group BYها هم بیارید.
ولی احتمالاً کوئری های ساده تر از این میشه فکر کنم ایجاد کرد یکم کار کنین خودتون دستتون میاد.
شما الان students.LName رو از کجای این دستور میخواین در بیارین که؟! :متفکر:

دوست من ببینید

متاسفانه من کد رو کامل متوجه نشدم که توش تغییر بدم و به جواب برسم
تغییر میدم ولی آگاهانه نیست و مطمعنا به جواب هم نمیرسم
حالا ازتون درخواست دارم که یه مقدار درمورد کاری که داریم میکنیم توضیح بدید و بگید قسمت های مختلف این کد داره چیکار میکنه تا بتونم خودم روش تغییرات بدم تا به جواب برسم
البته لطف میکنید اگه این زحمت رو بکشید

اینم آخرین تغییر من که نمیدونم دارم درست پیش میرم یا نه



SELECT students.ID, students.FName, students.LName, SUM(Debts.price) as Bedehi, SUM(Receipts.price) as PardakhtiFROM ( SELECT students.ID, students.FName, students.LName, SUM(Debts.price) as BedehiFROM students LEFT JOIN Debts on students.ID = Debts.student_idGROUP BY students.ID, students.FName, students.LName) as students LEFT JOIN( SELECT students.ID, students.FName, students.LName, SUM(Receipts.price) as PadakhtiFROM students LEFT JOIN Receipts on students.ID = Receipts.student_idGROUP BY students.ID, students.FName, students.LName) as Debtson students.ID = Debts.student_idGROUP BY students.ID, students.FName, students.LNameORDER BY students.ID

اینم اخطاری که به این کد میده

125733

sajadsobh
شنبه 24 آبان 1393, 22:08 عصر
خب ببینید اون روشی که اول گفتم و شما بکار بردید اینطور بود که وقتی شما پیوند بین جداول بدهی و دانشجو رو انجام میدادید بعدش میومد با جدول پرداختی پیوند تشکیل میداد که در اینصورت هر رکورد حاصل از پیوند اول با جدول سوم ادغام میشد واسه همون هر پرداختی چند بار نشون داده میشد و در جمع مشکل ایجاد میکرد.
من اومدم توی روش دوم دو تا پیوند جدا رو در نظر گرفتم. یکی پیوند بین جدول دانشجو و بدهی و دومی پیوند بین جدول دانشجو و پرداختی. حالا باید این دو جدول جدا رو که جداگانه پیوند دادیم بوسیله یه پیوند دیگه که نقطه مشترکشون ID دانشجو هست بهم ربط بدیم. البته این روشی هست که من استفاده کردم و شاید یکم گیج کننده باشده. حالا اگه کس دیگه از دوستان می تونن راهنمایی کنن خوشحال میشیم یاد بگیریم.

برای مثال من اولین پیوند رو که بین جداول دانشجو بدهی است اینجوری دارم:

SELECT Daneshjoo.ID, Daneshjoo.name, SUM(Bedehi.Mablagh) as Bedehi
FROM Daneshjoo LEFT JOIN Bedehi on Daneshjoo.ID = Bedehi.ID
GROUP BY Daneshjoo.ID, Daneshjoo.name

و خروجی این دستور میشه ID و نام دانشجو و جمع بدهی هر دانشجو:

125734

حالا دومین پیوند بین جدول دانشجو پرداختی:

SELECT Daneshjoo.ID, Daneshjoo.name, SUM(Pardakhti.Mablagh) as Padakhti
FROM Daneshjoo LEFT JOIN Pardakhti on Daneshjoo.ID = Pardakhti.ID
GROUP BY Daneshjoo.ID, Daneshjoo.name

و خروجی رو به اینصورت داریم:


125735

حالا این دستور رو ببینید:

SELECT *
FROM (
SELECT Daneshjoo.ID, Daneshjoo.name, SUM(Bedehi.Mablagh) as Bedehi
FROM Daneshjoo LEFT JOIN Bedehi on Daneshjoo.ID = Bedehi.ID
GROUP BY Daneshjoo.ID, Daneshjoo.name) as t1
LEFT JOIN
(SELECT Daneshjoo.ID, Daneshjoo.name, SUM(Pardakhti.Mablagh) as Padakhti
FROM Daneshjoo LEFT JOIN Pardakhti on Daneshjoo.ID = Pardakhti.ID
GROUP BY Daneshjoo.ID, Daneshjoo.name) as t2
on t1.ID = t2.ID

اومدم تمام ستون های حاصل از پیوند این دو تا پیوند جداگانه رو select کردم. t1 جدول حاصل از پیوند اوله و t2 جدول حاصل از پیوند دوم. ببینید نتیجه چی میشه؟!



125736

حالا من باید فقط ستون های ID، نام دانشجو و جمع بدهی ها و پرداختی ها را نشون بدم.

پس میام بجای SELECT * از Select زیر استفاده میکنیم:

SELECT t1.ID, t1.name, Bedehi, Padakhti
FROM (
SELECT Daneshjoo.ID, Daneshjoo.name, SUM(Bedehi.Mablagh) as Bedehi
FROM Daneshjoo LEFT JOIN Bedehi on Daneshjoo.ID = Bedehi.ID
GROUP BY Daneshjoo.ID, Daneshjoo.name) as t1
LEFT JOIN
(SELECT Daneshjoo.ID, Daneshjoo.name, SUM(Pardakhti.Mablagh) as Padakhti
FROM Daneshjoo LEFT JOIN Pardakhti on Daneshjoo.ID = Pardakhti.ID
GROUP BY Daneshjoo.ID, Daneshjoo.name) as t2
on t1.ID = t2.ID

توجه کنین که Bedehi و Pardakhti که در سطر اول این دستور اومدن همون حاصل جمع بدهی ها و پرداختی هاست که ما توی پیوند های داخلی نامدهی کردیم.
SUM(Bedehi.Mablagh) as Bedehi و SUM(Pardakhti.Mablagh) as Padakhti منظورمه!!

الان این باید جواب بده. البته من توی sql چک کردم.

fahimi
یک شنبه 25 آبان 1393, 21:01 عصر
با استفاده از Common Table Expressions یا CTE می توان نیز انجام داد.


WITH Bedehi1 ( id, Bedehi)
AS
(SELECT ID, Mablagh AS Bedehi11 FROM Bedehi)
,Padakhti1 (ID, Padakhti)
AS
(SELECT ID, Mablagh as Padakhti11 FROM Pardakhti )
,Dnshjoo1(id,name)
as
(select id,name from Daneshjoo)
select Dnshjoo1.ID,Dnshjoo1.name,Bedehi1.Bedehi ,Padakhti1.Padakhti
FROM Bedehi1 INNER JOIN
Padakhti1 ON Bedehi1.id = Padakhti1.ID
INNER JOIN Dnshjoo1 on Bedehi1.id = Dnshjoo1.ID

myoosef
یک شنبه 25 آبان 1393, 21:17 عصر
TITLE: Microsoft SQL Server Management Studio
------------------------------

An error occurred when attaching the database(s). Click the hyperlink in the Message column for details.
سلام من ویندوزم رو عوض کردم بانک رو هم دی اتچ نکردم بعد نصب دوباره ویندوز با sqlاین ارور رو وقت اتچ کردن میده

sajadsobh
یک شنبه 25 آبان 1393, 23:12 عصر
TITLE: Microsoft SQL Server Management Studio
------------------------------

An error occurred when attaching the database(s). Click the hyperlink in the Message column for details.
سلام من ویندوزم رو عوض کردم بانک رو هم دی اتچ نکردم بعد نصب دوباره ویندوز با sqlاین ارور رو وقت اتچ کردن میده

اخطاری که میده رو بذارید ببینیم چیه مشکل. این که فقط الان میگه دیتابیس اتچ نمیشه و روی لینک زیرش کلیک کنید.

mortezahbh
دوشنبه 26 آبان 1393, 10:27 صبح
با استفاده از Common Table Expressions یا CTE می توان نیز انجام داد.


WITH Bedehi1 ( id, Bedehi)
AS
(SELECT ID, Mablagh AS Bedehi11 FROM Bedehi)
,Padakhti1 (ID, Padakhti)
AS
(SELECT ID, Mablagh as Padakhti11 FROM Pardakhti )
,Dnshjoo1(id,name)
as
(select id,name from Daneshjoo)
select Dnshjoo1.ID,Dnshjoo1.name,Bedehi1.Bedehi ,Padakhti1.Padakhti
FROM Bedehi1 INNER JOIN
Padakhti1 ON Bedehi1.id = Padakhti1.ID
INNER JOIN Dnshjoo1 on Bedehi1.id = Dnshjoo1.ID

ممنون از پاسختون

اما من چیز زیادی ازش متوجه نشدم :گیج: که این مشکل بنده س:افسرده:

در هر صورت من با کد آقا سجاد به نتیجه رسیدم :چشمک: