PDA

View Full Version : ایجاد فیلد سوم از محاسبه دو فیلد قبل



Sal_64
جمعه 25 بهمن 1387, 17:21 عصر
سلام

به همه دوستان

ایجاد فیلد سوم از محاسبه دو فیلد قبل

من در برنامه(تحت ویندوز) ستون سوم رو خودم ایجاد کردم و دستورات محاسبه رو برای اون نوشتم
و برنامه به درستی کار می کنه

اما این احتمال وجود داره که فرمول محاسبه تغییر کنه
پس بهتره که محاسبه هم در sp انجام شه
که در صورت نیاز به راحتی اون رو تصحیح کرد

به دلیل اینکه برا ی ستون سوم باید شرایط هم در نظر گرفته شود
کار کمی سخت تر شده

اون چیزی که احتیاج هست
چیزی شبیه به شبه کد زیر می باشد


لطفا ببینید


SELECT Code2, Name, Family,
SUM(CASE WHEN Mah = '04' AND Sal = '84' THEN Money ELSE 0 END) as Sum1,
SUM(CASE WHEN Mah = '11' AND Sal = '84' THEN Money ELSE 0 END) as Sum2,
so=
(
if(SUM(CASE WHEN Mah = '04' AND Sal = '84' THEN Money ELSE 0 END) ='0')
return 0
else
return (SUM(CASE WHEN Mah = '04' AND Sal = '84' THEN Money ELSE 0 END)/SUM(CASE WHEN Mah = '11' AND Sal = '84' THEN Money ELSE 0 END))%100
)

FROM vTable3
GROUP BY Code2, Name, Family

با تشکر فراوان

AminSobati
شنبه 26 بهمن 1387, 02:03 صبح
دوست عزیزم،
میتونین در یک Query، فرمول رو بنویسید و بعد Query دیگری از قبلی بعنوان Subqeury استفاده کنه و راحت از فیلدهای محاسبه شده بهره ببره

Arghavan_Reza
شنبه 26 بهمن 1387, 11:18 صبح
SELECT *, CASE Sum2 WHEN 0 THEN 0 ELSE Sum1 / Sum2 END AS Percent
FROM (SELECT Code2, Name, ....)

Sal_64
شنبه 26 بهمن 1387, 17:01 عصر
سلام



میتونین در یک Query، فرمول رو بنویسید و بعد Query دیگری از قبلی بعنوان Subqeury استفاده کنه و راحت از فیلدهای محاسبه شده بهره ببرهدر این مورد تجربه ای ندارم
اگر قبلا در سایت این سوال مطرح شده بفرمایید چه واژه ای رو جستجو کنم
و اگر نه
ممکن همین مورد رو با نمونه کد پیاده سازی کنید



SELECT *, CASE Sum2 WHEN 0 THEN 0 ELSE Sum1 / Sum2 END AS Percent
FROM (SELECT Code2, Name, ....تشکر



با تشکر

Sal_64
یک شنبه 27 بهمن 1387, 21:21 عصر
سلام


در این مورد تجربه ای ندارم
اگر قبلا در سایت این سوال مطرح شده بفرمایید چه واژه ای رو جستجو کنم
و اگر نه
ممکن همین مورد رو با نمونه کد پیاده سازی کنید؟


SELECT *, CASE Sum2 WHEN 0 THEN 0 ELSE Sum1 / Sum2 END AS Percent
FROM (SELECT Code2, Name, ....)کد فوق این ایررور رو میده

Incorrect syntax near the keyword 'Percent'.
با تشکر

Arghavan_Reza
دوشنبه 28 بهمن 1387, 08:32 صبح
کد کامل :


SELECT *, CASE Sum2 WHEN 0 THEN 0 ELSE Sum1 / Sum2 * 100 END AS Percent1
FROM
(
SELECT Code2, Name, Family,
SUM(CASE WHEN Mah = '04' AND Sal = '84' THEN Money ELSE 0 END) as Sum1,
SUM(CASE WHEN Mah = '11' AND Sal = '84' THEN Money ELSE 0 END) as Sum2
FROM vTable3
GROUP BY Code2, Name, Family
) X

Sal_64
دوشنبه 28 بهمن 1387, 12:17 عصر
سلام

تشکر

من برای اینکه در سمت برنامه بتونم مقادیر 1sum و sum2 رو با فرمت خاص برنامه فرمت بندی کنم
به varchar تبدیل کردم
و در خط اول کد برا ی محاسبات ریاضی می بایست فرمت رو به فرمت عددی برگردونم
که بشه اعداد رو ضرب و تقسیم کرد
sum1 و sum2 رو به bigint کانورت کردم

اما ایررور زیر رو میده

The conversion of the varchar value '29722624000000' overflowed an int column. Maximum integer value exceeded
با تشکر

Arghavan_Reza
دوشنبه 28 بهمن 1387, 13:49 عصر
از ابزارهای زبان برنامه نویسی جهت تبدیل به string استفاده کنید.
دستورات SQL را از حالت نرمال و منطقی خارج نکنید.

Sal_64
شنبه 21 شهریور 1388, 00:14 صبح
سلام
این کدها رو ببینید
vsource یک ویو که از 2 تا تیبل ایجاد شده
ایرور نمیده اما
جواب حاصل نادرست
حاصل sum ها درست نیست



SELECT vsource.Code,
cast(SUM(CASEWHEN vsource.Mah='06'AND vsource.Sal ='86'THEN vsource.vosol ELSE 0 END)asvarchar(15))as sum1,
cast(SUM(CASEWHEN sahmm.Mah='06'AND sahmm.Sal ='86'THEN sahmm.sahm ELSE 0 END)asvarchar(15))as sum2
FROM sahmm,vsource
GROUPBY vsource.Code


لطفا کدها رو بررسی کنید

با تشکر

Sal_64
یک شنبه 22 شهریور 1388, 15:57 عصر
سلامدوستان کد ها رو دیدیدلطفا نظرتون رو بگیدبرای تصحیح کدها چیکار کنمبا تشکر

محمد سلیم آبادی
یک شنبه 22 شهریور 1388, 16:33 عصر
منظورت از این خطی که با رنگ قرمز مشخص کردم چیه؟
در واقع شما دو جدول را با یکدیگر ضرب کردید، و از JOINسبک قدیمی استفاده کردید...


SELECT vsource.Code,
cast(SUM(CASE WHEN vsource.Mah='06'AND vsource.Sal ='86'THEN vsource.vosol ELSE 0 END)as varchar(15))as sum1,
cast(SUM(CASE WHEN sahmm.Mah='06'AND sahmm.Sal ='86'THEN sahmm.sahm ELSE 0 END)as varchar(15))as sum2
FROM sahmm, vsource
GROUP BY vsource.Code

Sal_64
دوشنبه 23 شهریور 1388, 18:34 عصر
منظورت از این خطی که با رنگ قرمز مشخص کردم چیه؟

همونطور که گفتم vsource یک view که ترکیبی از فیلدهای دو تا تیبل
و shamm هم تیبل دیگه است

در واقع منابعی که اطلاعات باید از اونا استخراج شن !

محمد سلیم آبادی
سه شنبه 24 شهریور 1388, 00:59 صبح
نمی دونم باید به این تاپیک پاسخ بدم یا که نه!
آدم واقعا گیج می شود، شما از توابع aggregate در case استفاده کردید ولی در قسمت table source دست به چنین کاری زدید.
در واقع کاری را که شما انجام داده اید time/cross/product است، می دانید؟
مشکلتان دقیقا چیست، یعنی از کوئری که پست کردید چه انتظاری دارید؟ می خواهید چه چیزی نمایش بدهد که نمی دهد؟

Sal_64
سه شنبه 24 شهریور 1388, 10:05 صبح
شاید یه دستور where هم نیاز باشه :متفکر:
از ویو vsource قراره مجموع vosol در یک تاریخ خاص محاسبه شه
از تیبل shamm هم همینطور
با شرط برابر بودن vsource.code با shamm.code


رکورد حاصل (یه مثال)
کد وصول سهم
12 5000 8600

محمد سلیم آبادی
سه شنبه 24 شهریور 1388, 10:34 صبح
شاید یه دستور where هم نیاز باشه :متفکر:
از ویو vsource قراره مجموع vosol در یک تاریخ خاص محاسبه شه
از تیبل shamm هم همینطور
با شرط برابر بودن vsource.code با shamm.code


رکورد حاصل (یه مثال)
کد وصول سهم
12 5000 8600

نمی دانم چرا در Query ای که اخیرا پست کردین من شرطی نمی میبنم :متفکر:



...
FROM vsource v, shamm s
where s.code=v.vode

یا


...
FROM vsource v
INNER JOIN shamm s
ON v.code=s.code

یا


...
FROM vsource v
CROSS JOIN shamm
WHERE v.code=s.code

Sal_64
سه شنبه 24 شهریور 1388, 17:11 عصر
هر کدوم از sum ها اگر در query مجزا اجرا شه جواب کاملا صحیحه

اما زمانیکه با هم داخل یه query چه با شرط چه بدون شرط اجرا میشه جواب یکیه و اشتباهه

:متفکر:

محمد سلیم آبادی
سه شنبه 24 شهریور 1388, 17:50 عصر
هر کدوم از sum ها اگر در query مجزا اجرا شه جواب کاملا صحیحه

اما زمانیکه با هم داخل یه query چه با شرط چه بدون شرط اجرا میشه جواب یکیه و اشتباهه

:متفکر:

اگر واقعا اینگونه است که فکر نمی کنم اینطور باشه!
یعنی محاسبه دو ستون مجزا در دو query یکسان!؟

واقعا اگر اینطوری است کاری ندارد داخل دو Derived Table مجزا مقادیر ستون ها را بدست آوردید و با کمک ستون مشترک (code) به همدیگر join کنید.

Sal_64
سه شنبه 24 شهریور 1388, 23:07 عصر
داخل دو Derived Table مجزا مقادیر ستون ها را بدست آوردید و با کمک ستون مشترک (code) به همدیگر join کنید.

میشه با کد توضیح بدید

محمد سلیم آبادی
سه شنبه 24 شهریور 1388, 23:35 عصر
select c as Code,
d1.sum1 as Sum1,
d2.sum2 as Sum2
from
(
SELECT c=vsource.Code,
cast(SUM(CASE WHEN vsource.Mah='06'AND vsource.Sal ='86'THEN vsource.vosol ELSE 0 END)as varchar(15))as sum1
FROM sahmm, vsource
where s.code=v.vode
GROUP BY vsource.Code
)d1
inner join
(
SELECT c=vsource.Code,
cast(SUM(CASE WHEN sahmm.Mah='06'AND sahmm.Sal ='86'THEN sahmm.sahm ELSE 0 END)as varchar(15))as sum2
FROM sahmm, vsource
where s.code=v.vode
GROUP BY vsource.Code
)d2
on d1.c=d2.c

Sal_64
چهارشنبه 25 شهریور 1388, 13:39 عصر
Msg 209, Level 16, State 1, Line 2
Ambiguous column name 'c'.

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 14:06 عصر
Msg 209, Level 16, State 1, Line 2
Ambiguous column name 'c'.


select d1.c as Code,
d1.sum1 as Sum1,
d2.sum2 as Sum2

Sal_64
چهارشنبه 25 شهریور 1388, 17:45 عصر
جواب حاصل صحیح نیست

اما زمانیکه با هم داخل یه query چه با شرط چه بدون شرط اجرا میشه جواب یکیه و اشتباهه

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 18:51 عصر
اگر شما می خواهید مشکلات حل شود به مورد زیر عمل کنید.
اسکریپت کد و داده های بانکتان را (جداول و ویوهایی که در این query درگیر شده اند) را ضمیمه ی این تاپیک کنید.
اگر از SQL 2000/2005 استفاده می کنید با کمک نرم افزار Microsft SQL Server Publishing Wizard این کار امکان پذیر است.
اگر هم از 2008 استفاده می کنید با کمک generate script خود engin امکان پذیر است.

سپس سعی می کنم خودم query صحیح را ایجاد و پست کنم.
من دیر تالار می نشینم تا شما اسکریپت های جداول و ویوهایتان را پست کنید.:لبخند:

Sal_64
چهارشنبه 25 شهریور 1388, 23:03 عصر
اسکریپت کد و داده های بانکتان را (جداول و ویوهایی که در این query درگیر شده اند) را ضمیمه ی این تاپیک کنید

دیتابیس رو ضمیمه کردم

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 23:51 عصر
اینو امتحان کن ببین همونی است که دنبالش می گردید:



select d1.code,
d1.sum1,
sum2=ISNULL(d2.sum2, 0)
from
(
select v.code,
sum1=sum(vosol)
from dbo.vsource v
where v.Mah='06'AND v.Sal ='86'
group by v.code
)d1 left join
(
select s.code,
sum2=SUM(sahm)
from dbo.sahmmomkol s
where s.Mah='06'AND s.Sal ='86'
group by s.code
)d2 on d1.code=d2.code

Sal_64
پنج شنبه 26 شهریور 1388, 21:20 عصر
اینو امتحان کن ببین همونی است که دنبالش می گردید
تشکر

یه سوال دیگه
قراره روی اون دو تا ستون اعمال محاسبه ای دیگه ای { 100 * (sum1/sum2) } انجام شه و ریخته شه در ستون سوم
آیا امکان داره

محمد سلیم آبادی
پنج شنبه 26 شهریور 1388, 21:47 عصر
دوست خوبم ما را جدی جدی گرفتی؟


select d1.code,
d1.sum1,
sum2=ISNULL(d2.sum2, 0),
d1.sum/d2.sum*100 as COLUMN_THREE



جداولت هم که اصلا نرمال نبودند، نه کلیدی نه قیدی نه بندی....