PDA

View Full Version : تولید کوئری بر روی یک فیلد عددی



sg.programmer
چهارشنبه 22 شهریور 1396, 19:43 عصر
سلام

چنین کوئری را چطوری تولید کنم؟
درجدولم یک فیلد عددی X دارم - میخوام با استفاده از مقداری که داخل این فیلد هست کار زیر صورت بگیره
if (x>=1or x<=15)
n1++
else if (x>=16or x<=30)
n2++
else if (x>=31)
n3++



1) بر اساس هر سطری این مقادیر (n1 , n2 , n3) چاپ بشه

و 2) همچنین بر اساس همین کوئری بصورت یک بازه زمانی چطور خواهد بود؟

رامین مرادی
پنج شنبه 23 شهریور 1396, 09:44 صبح
سلام

چنین کوئری را چطوری تولید کنم؟
درجدولم یک فیلد عددی X دارم - میخوام با استفاده از مقداری که داخل این فیلد هست کار زیر صورت بگیره
if (x>=1or x<=15)
n1++
else if (x>=16or x<=30)
n2++
else if (x>=31)
n3++



1) بر اساس هر سطری این مقادیر (n1 , n2 , n3) چاپ بشه

و 2) همچنین بر اساس همین کوئری بصورت یک بازه زمانی چطور خواهد بود؟


وقت بخیر
اینو تست کنید



select
case
when x>=1 or x<=14 then n1+1
when x>=16 or x<=30 then n2+1
when x>=31 then n3+1
end as n
from table1
where table1.date between '2017/01/01' and '2017/02/02'

رامین مرادی
پنج شنبه 23 شهریور 1396, 09:51 صبح
وقت بخیر
اینو تست کنید



select
case
when x>=1 or x<=14 then n1+1
when x>=16 or x<=30 then n2+1
when x>=31 then n3+1
end as n
from table1
where table1.date between '2017/01/01' and '2017/02/02'



در ضمن توی شرطتون فک کنم به جای or بهتره از and استفاده کنید. چون عدد x هر چی باشه بقیه شرطها بررسی نمیشه چون همون اول شرط صادق میشه و n1 رو محاسبه میکنه و برمیگردونه.

نکته: من متوجه نشدم منظورتون از اون n1 ,n2,n3 چی هست .(همشون چاپ بشه یا یکی) بهتر بود جدولتونو هم میزاشتین

sg.programmer
پنج شنبه 23 شهریور 1396, 13:16 عصر
شرط OR بهتر نیست ؟ چون اگه یکی از شرط ها درست بود نیازی به چک کردن شرط بعدی نخواهد شد.

جدولم را بزارم گمراه کننده خواهد شد:

n1,n2,n3 سه متغییر هستند که میخوام سیستم تولید کنه و در خروجی کوئری ظاهر بشن

رامین مرادی
پنج شنبه 23 شهریور 1396, 14:13 عصر
شرط OR بهتر نیست ؟ چون اگه یکی از شرط ها درست بود نیازی به چک کردن شرط بعدی نخواهد شد.

جدولم را بزارم گمراه کننده خواهد شد:

n1,n2,n3 سه متغییر هستند که میخوام سیستم تولید کنه و در خروجی کوئری ظاهر بشن


خب بر فرض مثال x شما برابر بود با 18 خب در این حالت باید شرط دومتون اجرا میشد ولی در عمل شرط اول اجرا میشد. با این شرطی که شما نوشتید بقیه شرطها رو میتونید حذف کنید. چون همیشه اگه x بزرگتر از صفر باشه شرط اول شما صادق میشه و دیگه نمیره شرط های بعدی رو اجرا کنه. در ضمن اگه میخواید هر سه متغییر تو خروجی باشه بگید کد رو اصلاح کنم. بهتره جدول رو هم بزاری.

اینو ببینید.
الان x =18 هست
شروع
شرط اول : آیا x>=1 هست؟یا x<14 هست ؟ بله پس n1++(خاصیت or اینه که کافیه یکی از شرطها صادق باشه )

sg.programmer
جمعه 24 شهریور 1396, 19:48 عصر
خب بر فرض مثال x شما برابر بود با 18 خب در این حالت باید شرط دومتون اجرا میشد ولی در عمل شرط اول اجرا میشد. با این شرطی که شما نوشتید بقیه شرطها رو میتونید حذف کنید. چون همیشه اگه x بزرگتر از صفر باشه شرط اول شما صادق میشه و دیگه نمیره شرط های بعدی رو اجرا کنه. در ضمن اگه میخواید هر سه متغییر تو خروجی باشه بگید کد رو اصلاح کنم. بهتره جدول رو هم بزاری.

اینو ببینید.
الان x =18 هست
شروع
شرط اول : آیا x>=1 هست؟یا x<14 هست ؟ بله پس n1++(خاصیت or اینه که کافیه یکی از شرطها صادق باشه )

آره حق با شما هست مهندس باید And باشه

آره میخوام هر سه متغییر در خروجی بیان

sg.programmer
جمعه 24 شهریور 1396, 19:55 عصر
فیلد های جدولم خیلی زیاد هست و سردرگم کننده هست.
من دوتا فیلد دارم با نام های RT , Freez و برای هر کدوم میخوام سه متغییر در خروجی بیان با نام های N1,N2,N3 اگه RT بین 1 تا 15 بود یکی به N1 اضاف بشه و اگر بین 16تا 30 بود به N2 یکی اضاف بشه و اگر بیشتر از 31 بود به N3 یکی اضاف بشه و در نهایت به جای RT این سه متغیر در خروجی ظاهر بشن ( اینا عددهای هستن که در RT قرارگرفته و بر اساس اون شرط تصمیم گیری میشه از کدوم نوع پاکت N1..3 نیاز بوده و چه تعداد)

برای فیلد Freez هم به همین طریق M1 , M2 , M3

رامین مرادی
شنبه 25 شهریور 1396, 08:19 صبح
ببینید آخه متغییر های N شما کجا هستن؟ تو جدول هستن یا به صورت یک متغییر تعریف کردید تو اس کیو ال؟
من دستورشو میدم فقط نمیدونم این متغییر های n از کجا اومدن



select
case
when x>=1 or x<=14 then n1+1
ELSE
n1
end as n1,
case
when x>=16 or x<=30 then n2+1
ELSE
n2
end as n2,
case
when x>=31 then n3+1
ELSE
n3
end as n3


from table1
where table1.date between '2017/01/01' and '2017/02/02'

Mahmoud.Afrad
شنبه 25 شهریور 1396, 17:29 عصر
بازه اعداد را باید با and بیان کنید.
از تابع count استفاده کنید و شرط شمارش را داخل همین فانکشن بیان کنید
select
COUNT(case when x>=1 and x<=14 then x else null end) 'range1',
COUNT(case when x>=16 and x<=30 then x else null end) 'range2',
COUNT(case when x>=31 then x else null end) 'range3'
from [Table_Name]

اگر هم میخواهید طبق کوئری آقای رامین مرادی (http://barnamenevis.org/member.php?146794-%D8%B1%D8%A7%D9%85%DB%8C%D9%86-%D9%85%D8%B1%D8%A7%D8%AF%DB%8C) انجام بدید بایست تغییراتی بدید تا ببتونید بشمارید
declare @n1 as int = 0;
declare @n2 as int = 0;
declare @n3 as int = 0;

select
@n1 = @n1 + (case when x>=1 and x<=14 then 1 else 0 end),
@n2 = @n2 + (case when x>=16 and x<=30 then 1 else 0 end),
@n3 = @n3 + (case when x>=31 then 1 else 0 end)
from [Table_Name]

select @n1, @n2, @n3

sg.programmer
شنبه 25 شهریور 1396, 22:04 عصر
تشکر آقای مرادی
و تشکر آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) خیلی جالب بود:

این کد چه معنی برای Null داره من صفر که میزارم جواب کلی میده : اگه زحمتی نیست توضیحی برای این کد بدید


case when x>=1 and x<=14 then x else null end

Mahmoud.Afrad
یک شنبه 26 شهریور 1396, 04:36 صبح
تشکر آقای مرادی
و تشکر آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) خیلی جالب بود:

این کد چه معنی برای Null داره من صفر که میزارم جواب کلی میده : اگه زحمتی نیست توضیحی برای این کد بدید


case when x>=1 and x<=14 then x else null end

در تابع count هر چیزی شمارش میشه غیر null. اگر x در بازه بود x را می‌شمارد و اگر نبود null را. البته null (یعنی هیچی) در شمارش تاثیری ندارد. به همین دلیل هر مقداری(حتی صفر) در else باشد در شمارش تاثیر میگذارد و تعداد کلی میده.
با count نوشتم تا متوجه بشید البته با sum هم میشه نوشت به اینصورت که به ازای هر x اگر در بازه بود، عدد یک و در غیراینصورت صفر را در نظر بگیرد و این مقدارها(صفرها و یکها) را sum کند
select
SUM(case when x>=1 and x<=14 then 1 else 0 end) 'range1',
SUM(case when x>=16 and x<=30 then 1 else 0 end) 'range2',
SUM(case when x>=31 then 1 else 0 end) 'range3'
from [Table_Name]

sg.programmer
یک شنبه 26 شهریور 1396, 19:58 عصر
جای تشکر داره آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad)
خیلی لطف کردید پاسختون جامع بود