تولید کوئری بر روی یک فیلد عددی
سلام
چنین کوئری را چطوری تولید کنم؟
درجدولم یک فیلد عددی X دارم - میخوام با استفاده از مقداری که داخل این فیلد هست کار زیر صورت بگیره
if (x>=1or x<=15)
n1++
else if (x>=16or x<=30)
n2++
else if (x>=31)
n3++
1) بر اساس هر سطری این مقادیر (n1 , n2 , n3) چاپ بشه
و 2) همچنین بر اساس همین کوئری بصورت یک بازه زمانی چطور خواهد بود؟
نقل قول: تولید کوئری بر روی یک فیلد عددی
نقل قول:
نوشته شده توسط
sg.programmer
سلام
چنین کوئری را چطوری تولید کنم؟
درجدولم یک فیلد عددی 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'
نقل قول: تولید کوئری بر روی یک فیلد عددی
نقل قول:
نوشته شده توسط
رامین مرادی
وقت بخیر
اینو تست کنید
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 چی هست .(همشون چاپ بشه یا یکی) بهتر بود جدولتونو هم میزاشتین
نقل قول: تولید کوئری بر روی یک فیلد عددی
شرط OR بهتر نیست ؟ چون اگه یکی از شرط ها درست بود نیازی به چک کردن شرط بعدی نخواهد شد.
جدولم را بزارم گمراه کننده خواهد شد:
n1,n2,n3 سه متغییر هستند که میخوام سیستم تولید کنه و در خروجی کوئری ظاهر بشن
نقل قول: تولید کوئری بر روی یک فیلد عددی
نقل قول:
نوشته شده توسط
sg.programmer
شرط OR بهتر نیست ؟ چون اگه یکی از شرط ها درست بود نیازی به چک کردن شرط بعدی نخواهد شد.
جدولم را بزارم گمراه کننده خواهد شد:
n1,n2,n3 سه متغییر هستند که میخوام سیستم تولید کنه و در خروجی کوئری ظاهر بشن
خب بر فرض مثال x شما برابر بود با 18 خب در این حالت باید شرط دومتون اجرا میشد ولی در عمل شرط اول اجرا میشد. با این شرطی که شما نوشتید بقیه شرطها رو میتونید حذف کنید. چون همیشه اگه x بزرگتر از صفر باشه شرط اول شما صادق میشه و دیگه نمیره شرط های بعدی رو اجرا کنه. در ضمن اگه میخواید هر سه متغییر تو خروجی باشه بگید کد رو اصلاح کنم. بهتره جدول رو هم بزاری.
اینو ببینید.
الان x =18 هست
شروع
شرط اول : آیا x>=1 هست؟یا x<14 هست ؟ بله پس n1++(خاصیت or اینه که کافیه یکی از شرطها صادق باشه )
نقل قول: تولید کوئری بر روی یک فیلد عددی
نقل قول:
نوشته شده توسط
رامین مرادی
خب بر فرض مثال x شما برابر بود با 18 خب در این حالت باید شرط دومتون اجرا میشد ولی در عمل شرط اول اجرا میشد. با این شرطی که شما نوشتید بقیه شرطها رو میتونید حذف کنید. چون همیشه اگه x بزرگتر از صفر باشه شرط اول شما صادق میشه و دیگه نمیره شرط های بعدی رو اجرا کنه. در ضمن اگه میخواید هر سه متغییر تو خروجی باشه بگید کد رو اصلاح کنم. بهتره جدول رو هم بزاری.
اینو ببینید.
الان x =18 هست
شروع
شرط اول : آیا x>=1 هست؟یا x<14 هست ؟ بله پس n1++(خاصیت or اینه که کافیه یکی از شرطها صادق باشه )
آره حق با شما هست مهندس باید And باشه
آره میخوام هر سه متغییر در خروجی بیان
نقل قول: تولید کوئری بر روی یک فیلد عددی
فیلد های جدولم خیلی زیاد هست و سردرگم کننده هست.
من دوتا فیلد دارم با نام های RT , Freez و برای هر کدوم میخوام سه متغییر در خروجی بیان با نام های N1,N2,N3 اگه RT بین 1 تا 15 بود یکی به N1 اضاف بشه و اگر بین 16تا 30 بود به N2 یکی اضاف بشه و اگر بیشتر از 31 بود به N3 یکی اضاف بشه و در نهایت به جای RT این سه متغیر در خروجی ظاهر بشن ( اینا عددهای هستن که در RT قرارگرفته و بر اساس اون شرط تصمیم گیری میشه از کدوم نوع پاکت N1..3 نیاز بوده و چه تعداد)
برای فیلد Freez هم به همین طریق M1 , M2 , M3
نقل قول: تولید کوئری بر روی یک فیلد عددی
ببینید آخه متغییر های 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'
نقل قول: تولید کوئری بر روی یک فیلد عددی
بازه اعداد را باید با 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]
اگر هم میخواهید طبق کوئری آقای رامین مرادی انجام بدید بایست تغییراتی بدید تا ببتونید بشمارید
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
نقل قول: تولید کوئری بر روی یک فیلد عددی
تشکر آقای مرادی
و تشکر آقای Mahmoud.Afrad خیلی جالب بود:
این کد چه معنی برای Null داره من صفر که میزارم جواب کلی میده : اگه زحمتی نیست توضیحی برای این کد بدید
case when x>=1 and x<=14 then x else null end
نقل قول: تولید کوئری بر روی یک فیلد عددی
نقل قول:
نوشته شده توسط
sg.programmer
تشکر آقای مرادی
و تشکر آقای
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]
نقل قول: تولید کوئری بر روی یک فیلد عددی
جای تشکر داره آقای Mahmoud.Afrad
خیلی لطف کردید پاسختون جامع بود