ورود

View Full Version : ادغام 3 دستور select



narges_j
دوشنبه 14 مرداد 1392, 03:00 صبح
من سرچ زدم ولی هر کدام از روش ها را امتحان کردم به جواب نرسیدم
3 تا دستور select دارم
select NameS,FamilyS,IDS from Sahamdar

select SUM(SumPardakht) from FactorForosh

select SUM(Mablagh) from Sarmaieh

دستور اول مربوط به سهام داران هست.دستور دوم جمع کل خرید سهام دار و دستور سوم جمع کل میزان سرمایه سهام دار....
میخوام این سه دستور را با هم ادغام کنم که برای هر سرمایه دار میزان خرید و میزان سرمایه را نمایش بدم.در واقع این یک سرچ کلی هست.
از select تو در تو ،دستور join ،دستور union ،... استفاده کردم نشد....
لطفا راهنماییم کنید

Reza_Yarahmadi
دوشنبه 14 مرداد 1392, 08:47 صبح
میتونید بصورت زیر عمل کنید
With tbl as(
select
IDS,
SUM(SumPardakht) TotalSumPardakht,
SUM(Mablagh) TotalMablagh
from
Sahamdar
Group By
IDS)
Select
T.IDS,
TN.NameS,
TN.FamilyS,
T.TotalSumPardakht,
T.TotalMablagh
From
TableName TN INNER JOIN tbl T
ON
TN.IDS = T.IDS

narges_j
دوشنبه 14 مرداد 1392, 09:54 صبح
من به صورت زیر نوشتم ولی خطا میده

With tbl as(
select
IDS,
SUM(Sarmaieh.Mablagh ) TotalMablagh
from Sarmaieh
Group By IDS),

tbl1 as (select IDS, SUM(FactorForosh.SumPardakht) TotalSumPardakht from FactorForosh group by IDS)

Select
T.IDS,
TN.NameS,
TN.FamilyS,
T.TotalSumPardakht,
TB.TotalMablagh
From
Sahamdar TN INNER JOIN tbl T
ON
TN.IDS = T.IDS
inner join tbl1 TB on TN.IDS=TB.IDS

خطا
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon

Salah Sanjabian
دوشنبه 14 مرداد 1392, 10:15 صبح
سلام . جناب یاراحمدی SumPardakht و Mablagh جزو جدول Sahamdar نیستن


SELECT IDs,Names,Familys,
ISNULL((SELECT SUM(SumPardakht) FROM dbo.FactorForosh
WHERE IDs=dbo.Sahamdar.IDs
GROUP BY IDs ),0) AS SumPardakht,

ISNULL((SELECT SUM(Mablagh) FROM dbo.Sarmaieh
WHERE IDs=dbo.Sahamdar.IDs
GROUP BY IDs ),0) AS Mablagh

FROM dbo.Sahamdar

narges_j
دوشنبه 14 مرداد 1392, 10:26 صبح
جدول هام بصورت زیر
sarmaie(IDS,Mablagh,Sharh)
FactorForosh(IDFactor,IDS,SumPardakht,...)
Sahamdar(IDS,NameS,FamilyS,...(

باید 3تا کوئری داشته باشم طبق IDS

narges_j
دوشنبه 14 مرداد 1392, 10:33 صبح
حل شد
باید قبل از with یک ; میگذاشتم
خیلی ممنون از راهنماییهاتون
use [mali]
;
with tbl as
(
select
Sarmaieh.IDS,
SUM(Sarmaieh.Mablagh) TotalMablagh
from Sarmaieh
Group By Sarmaieh.IDS ),

tbl1 as (select IDS, SUM(FactorForosh.SumPardakht) TotalSumPardakht from FactorForosh group by IDS)

select * from Sahamdar tb inner join tbl t on tb.IDS=t.IDS inner join tbl1 h on tb.IDS=h.IDS

محمد سلیم آبادی
دوشنبه 14 مرداد 1392, 11:17 صبح
کدهاتون رو داخل کد تگ بذارین.
دقت داشته باشید در select آخری نباید از * برای انتخاب تمام ستون ها استفاده کنید. چون IDS های تکراری خواهید داشت. اگر قصد دارین تمام ستون های موجود در جدول Sahamdar انتخاب بشه کافیه نام آن جدول یا نام مستعارش را همراه با .* بکار ببرین. مثل کد زیر.
و همچنین الزامی نیست که حتما با with مساله رو حل کنید. نکته ای که در مورد استفاده از with هست اینه که عبارت قبل از آن حتما باید توسط semicolon به پایان رسیده باشه.

این کوئری شماست با کمی اصلاح:
;with tbl(IDS, TotalMablagh) as
(
select IDS,
SUM(Mablagh)
from Sarmaieh
Group By IDS
),
tbl1(IDS, TotalSumPardakht) as
(
select IDS,
SUM(SumPardakht)
from FactorForosh
group by IDS
)
select tb.*, t.TotalMablagh, h.TotalSumPardakht
from Sahamdar tb
inner join tbl t
on tb.IDS=t.IDS
inner join tbl1 h
on tb.IDS=h.IDS;

و این کوئری بدون cte
select S.*, t1.TotalMablagh, t2.TotalSumPardakht
from Sahamdar S
inner join
(
select IDS,
SUM(Mablagh)
from Sarmaieh
Group By IDS
)t1(IDS, TotalMablagh)
on S.IDS = t1.IDS
inner join
(
select IDS,
SUM(SumPardakht)
from FactorForosh
group by IDS
)t2(IDS,TotalSumPardakht)
on S.IDS = t2.IDS;

Salah Sanjabian
دوشنبه 14 مرداد 1392, 11:22 صبح
کدی که نوشتی فقط به ازای رکورد اول اجرا میشه این قسمت از کدت مشکل داره

select
Sarmaieh.IDS,
SUM(Sarmaieh.Mablagh) TotalMablagh
from Sarmaieh
Group By Sarmaieh.IDS

. کد پست 4 رو براساس ساختارجدولات آپدیت شد

محمد سلیم آبادی
دوشنبه 14 مرداد 1392, 11:24 صبح
سلام . جناب یاراحمدی SumPardakht و Mablagh جزو جدول Sahamdar نیستن


SELECT IDs,Names,Familys,
ISNULL((SELECT SUM(SumPardakht) FROM dbo.FactorForosh
WHERE IDs=dbo.Sahamdar.IDs
GROUP BY IDs ),0) AS SumPardakht,

ISNULL((SELECT SUM(Mablagh) FROM dbo.Sarmaieh
WHERE IDs=dbo.Sahamdar.IDs
GROUP BY IDs ),0) AS Mablagh

FROM dbo.Sahamdar


دوست عزیز.
نکته اول: دوره این correlated subquery ها مخصوصا در ماده select سر اومده
نکته دوم: نیازی به group by در هر دو subquery نیست.
نکته سوم: میتونید به جدول dbo.Sahamdar نام مستعار مثلا S بدین تا راحتتر در subquery ها به آن ارجاع کنید.
نکته چهارم: نداره.

یعنی این:
SELECT IDs,Names,Familys,
ISNULL((SELECT SUM(SumPardakht)
FROM dbo.FactorForosh
WHERE IDs=S.IDs),0) AS SumPardakht,

ISNULL((SELECT SUM(Mablagh)
FROM dbo.Sarmaieh
WHERE IDs=S.IDs),0) AS Mablagh

FROM dbo.Sahamdar S

محمد سلیم آبادی
دوشنبه 14 مرداد 1392, 11:30 صبح
کدی که نوشتی فقط به ازای رکورد اول اجرا میشه این قسمت از کدت مشکل داره . کد پست 4 رو براساس ساختارجدولات آپدیت شد


select
Sarmaieh.IDS,
SUM(Sarmaieh.Mablagh) TotalMablagh
from Sarmaieh
Group By Sarmaieh.IDS

عزیز دلم. چه مشکلی داره؟ مشکل نداره که. دو تا query داره که هر کدوم به ازای هر IDS یک مقدار دارن (به خاطر group by) حالا این سه جدول که یک رابطه one-to-one دارن با هم در نهایت join میشن.

Salah Sanjabian
دوشنبه 14 مرداد 1392, 11:37 صبح
سلام کدی که شما نوشتین به ازای همه رکورد ها اجرا نمیشه و مشتری رو برمیگردونه که حتما در سه جدول وجود داشته باشه . حق باشماست کد من نیازی به Group by نداره. به هیچ عنوان از Alias استفاده نمیکنم چون خوشبحتانه Redgate Sql Prompt دارم و AutoCompletion رو کامل اجرا میکنه و رابطه خوبی با Alias ندارم همیشه از اسم کامل استفاده میکنم وشاید دلیلش اینه که به جداول همیشه به عنوان یه آبجکت در #C نگاه میکنم. یعنی هیچ وقت تو #C نمیتونم چنین شی رو تعریف کنم
Sahamdar S=new Sahamdar()
و همین منوال رو تو TSQL هم رعایت میکنم

محمد سلیم آبادی
دوشنبه 14 مرداد 1392, 11:50 صبح
کدی که شما نوشتین به ازای همه رکورد ها اجرا نمیشه و مشتری رو برمیگردونه که حتما در سه جدول وجود داشته باشه
حتما وجود داشته که از inner join به جای left join استفاده کرده!


به هیچ عنوان از Alias استفاده نمیکنم چون خوشبحتانه Redgate Sql Prompt دارم و AutoCompletion رو کامل اجرا میکنه
برنامش رو برام بفرست حتما


رابطه خوبی با Alias ندارم همیشه از اسم کامل استفاده میکنم
درسته توسط auto کارت راحت راه می افته اما کسی که بعدا میخواد اونو بخونه براش دشوار. فرض کن نام جدول همراه با نام ستون نزدیک به 40-50 کاراکتر با اسامی نامفهوم میشه... مخصوصا زمانی که اسامی شبیه به هم باشن.

narges_j
دوشنبه 14 مرداد 1392, 12:00 عصر
برنامه من اینطوری که هر سهام دار حتما حداقل یک سرمایه اولیه داره ولی حتما خرید نداره این قسمت که حتما خرید نداره را با left join بنویسم چون ممکن اصلا خرید نکرده باشه.
تو برنامه برای محاسبه سود هر سهام دار در هر تاریخ طبق میزان خرید و میزان سرمایه سودش حساب میشه به خاطر همین نیاز دارم میزان خرید و میزان سرمایه هر سهام دار نشان بدم

چیکار کنم از left join استفاده کنم؟؟؟؟؟

Salah Sanjabian
دوشنبه 14 مرداد 1392, 12:09 عصر
ربطی نداره . فرض کن مشتری فاکتور داشته(FactorFrosh ) ولی اصلا سرمایه نداشته (Sarmaieh) پس کد شما این مشتری رو نمایش نمیده چون رکوردی تو سرمایه به ازای مشتری مورد نظر ثبت نشده در حالی که باید مبلغ فاکتور فروش رو نمایش بده ولی چون سرمایه نداشته مبلغ سرمایه باید صفر باشه این لینک RedGate. بدون RedGate نمیتونم کار کنم نه تنها Sql Prompetبلکه مابقی Tools هاش

http://www.softgozar.com/WebPage/SoftwareDescription.aspx?SoftwareId=2164&Title=Red-Gate-SQL-Toolbelt-2013.1.8.2.353


ازاین استفاده کن


SELECT IDs,Names,Familys,
ISNULL((SELECT SUM(SumPardakht) FROM dbo.FactorForosh
WHERE IDs=dbo.Sahamdar.IDs
),0) AS SumPardakht,

ISNULL((SELECT SUM(Mablagh) FROM dbo.Sarmaieh
WHERE IDs=dbo.Sahamdar.IDs
),0) AS Mablagh

FROM dbo.Sahamdar

narges_j
دوشنبه 14 مرداد 1392, 12:12 عصر
این برنامه دو نوع فاکتور داره یکی واسه سهام داران یکی برای کسانی که سهام دار نیستن.من فقط با فاکتور سهام داران کار میکنم الان چون فقط سود سرمایه برای انها حساب میشه

تو کد پست 7 قسمت اخر به جای inner join از left join استفاده کردم درست شد

یه سوال دیگه میپرسم با اجازتون

میخواستم بدونم وقتی از معماری 3 لایه استفاده میکنیم در لایه Business بهتر از خود دستور sql استفاده کنیم مثل کوئری های پست های قبل یا از پرسیجر یا روش دیگری که بهتر باشه؟چه فرقی میکنن؟سرعت کدوم بیشتر؟؟

محمد سلیم آبادی
دوشنبه 14 مرداد 1392, 15:21 عصر
ربطی نداره . فرض کن مشتری فاکتور داشته(FactorFrosh ) ولی اصلا سرمایه نداشته (Sarmaieh) پس کد شما این مشتری رو نمایش نمیده چون رکوردی تو سرمایه به ازای مشتری مورد نظر ثبت نشده در حالی که باید مبلغ فاکتور فروش رو نمایش بده ولی چون سرمایه نداشته مبلغ سرمایه باید صفر باشه گفتم که چارش تغییر inner join به left join دیگه.


میخواستم بدونم وقتی از معماری 3 لایه استفاده میکنیم در لایه Business بهتر از خود دستور sql استفاده کنیم مثل کوئری های پست های قبل یا از پرسیجر یا روش دیگری که بهتر باشه؟چه فرقی میکنن؟سرعت کدوم بیشتر؟؟
کوئری را بزارید داخل پروسیجر و ازش استفاده کنید. خوبه

محمد سلیم آبادی
پنج شنبه 17 مرداد 1392, 16:53 عصر
ربطی نداره . فرض کن مشتری فاکتور داشته(FactorFrosh ) ولی اصلا سرمایه نداشته (Sarmaieh) پس کد شما این مشتری رو نمایش نمیده چون رکوردی تو سرمایه به ازای مشتری مورد نظر ثبت نشده در حالی که باید مبلغ فاکتور فروش رو نمایش بده ولی چون سرمایه نداشته مبلغ سرمایه باید صفر باشه این لینک RedGate. بدون RedGate نمیتونم کار کنم نه تنها Sql Prompetبلکه مابقی Tools هاش

http://www.softgozar.com/WebPage/SoftwareDescription.aspx?SoftwareId=2164&Title=Red-Gate-SQL-Toolbelt-2013.1.8.2.353


ازاین استفاده کن


SELECT IDs,Names,Familys,
ISNULL((SELECT SUM(SumPardakht) FROM dbo.FactorForosh
WHERE IDs=dbo.Sahamdar.IDs
),0) AS SumPardakht,

ISNULL((SELECT SUM(Mablagh) FROM dbo.Sarmaieh
WHERE IDs=dbo.Sahamdar.IDs
),0) AS Mablagh

FROM dbo.Sahamdar

و آنگاه ماکروسافت APPLY را خلق نمود:
SELECT S.*, ISNULL(D1.t1, ) AS SumPardakht, ISNULL(D2.t2, 0) AS Mablagh
FROM dbo.Sahamdar S
OUTER APPLY (SELECT SUM(SumPardakht)
FROM dbo.FactorForosh
WHERE IDs=dbo.Sahamdar.IDs)D1(t1)
OUTER APPLY (SELECT SUM(Mablagh)
FROM dbo.Sarmaieh
WHERE IDs=dbo.Sahamdar.IDs) D2(t2)