PDA

View Full Version : نوشتن کوئری تودرتو



rezayeman
دوشنبه 15 اردیبهشت 1393, 17:56 عصر
سلام

من یه جدول دارم که بارکد محصولات توش ذخیره میشه و از ستونهای Barcode, date, fault, UserName, Bazras,... تشکیل شده. توی ستون fault سه مقدار (سالم، معیوب، احتیاج به دوباره کاری) ذخیره میشه.

حالا میخوام از این جدول یه گزارش بگیرم که 3 ستون داشته باشه به نامهای (سالم، معیوب، احتیاج به دوباره کاری) که بر اساس تاریخ group بشه و جمع هر دسته از محصول زیر ستونش نوشته بشه. یعنی مثلا در تاریخ 93/02/15 ما 100 محصول سالم، 5 محصول معیوب و 6 محصول احتیاج به دوباره کاری داریم

من واسه 1 نوع یعنی سالم میتونم بنویسم اما نمیدونم چجوری میشه 3 تاشو با هم گرفت. نمیدونم تونستم منظورمو برسونم یا نه

اینم کوئری واسه یکیشون
select [date], COUNT([date])
from BarCode where Fault = 'سالم' group by [date]

Davidd
دوشنبه 15 اردیبهشت 1393, 18:21 عصر
Group By روي فيلد date و Fault انجام بده
اينو تست كن

select [date],Fault , COUNT(*)
from BarCode group by [date] , Fault

rezayeman
دوشنبه 15 اردیبهشت 1393, 21:01 عصر
اینو هم انجام دادم نشد

rezayeman
سه شنبه 16 اردیبهشت 1393, 08:10 صبح
کسی نتونست کمک کنه؟

cherchil_hra
سه شنبه 16 اردیبهشت 1393, 09:29 صبح
شما تصویر چند سطر از داده هات (مثلا 10 سطر) و تصویر خروجی مورد نظرت رو بذار تا راحت تر بشه کمکت کرد!

rezayeman
سه شنبه 16 اردیبهشت 1393, 10:18 صبح
با این دستور

select [date], Fault , COUNT(*)
from BarCode group by [date] , Fault

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

118693

حالا من میخوام به جای اینکه به این صورت سطری نشون بده و هی تاریخهارو تکرار کنه 3 ستون به نامهای سالم، معیوب, احتیاج به دوباره کاری داشته باشم و تو هر تاریخ مقدارش تو این ستونها باشه

و یعنی به جای اینکه مثلا تاریخ 93/02/01 سه بار تکرار بشه، یه بار این تاریخ نوشته بشه و مقادیرش در 3 ستون مختلف نشون داده بشه

rezayeman
سه شنبه 16 اردیبهشت 1393, 18:59 عصر
خودم جوابشو پیدا کردم

select MergesDate as 'Date', sum(ValidCount) as 'Valid', sum(DefectiveCount) as 'Defective', sum(RepairCount) as 'Repair', sum(distinct(MergesSum)) as 'Sum'


from (select MergesDate, ValidCount, DefectiveCount, RepairCount, MergesSum


from (((select dbo.GetShamsiDate([date]) as ValidDate, COUNT(fault) as ValidCount from BarCode where Fault = 'valid'
group by dbo.GetShamsiDate([date])) Valid full outer join

(select dbo.GetShamsiDate([date]) as DefectiveDate, COUNT(fault) as DefectiveCount from BarCode where Fault = 'defective'
group by dbo.GetShamsiDate([date])) Defective

on ValidDate = DefectiveDate) full outer join


(select dbo.GetShamsiDate([date]) as RepairDate, COUNT(fault) as RepairCount from BarCode where Fault = 'repair'
group by dbo.GetShamsiDate([date])) Repair


on RepairDate = ValidDate) full outer join
(select dbo.GetShamsiDate([date]) as MergesDate, COUNT(*) as MergesSum from BarCode
group by dbo.GetShamsiDate([date])) Merges

on MergesDate = ValidDate or MergesDate = DefectiveDate or MergesDate = RepairDate) as Result


group by MergesDate


118749
البته من مقدار سالم را به valid و معیوب را به defective و دوباره کاری رو به repair تغییر دادم

rezayeman
یک شنبه 21 اردیبهشت 1393, 16:24 عصر
یه سوال دیگه برای این موضوع دارم

چجوری به جای مقادیر null مقدار 0 قرار بدم؟

aslan
یک شنبه 21 اردیبهشت 1393, 18:34 عصر
از IsNull استفاده کنید .مثلا :
IsNull(Sum(Gvt_Percent),0) Gvt_Percent

argess
دوشنبه 22 اردیبهشت 1393, 07:50 صبح
چرا اینقدر سخت نوشتی؟ از case استفاده می کردی.
select MergesDate as 'Date', sum(case fault when 'salem' then 1 else 0 end) as 'Valid'





دوستان هر کس سئوال تخصصی داره می تونه توی این آدرس بزاره.
http://sorterir.majikblog.com/index.php

rezayeman
دوشنبه 22 اردیبهشت 1393, 08:10 صبح
argess عزیز سلام

حرفتون و جوابتون کاملا صحیحه. من خیلی سخت نوشتم کوئریمو. اینها همش برمیگرده به تجربه. من خیلی ازت ممنونم که وقت گذاشتی و این راه حلو پیشنهاد دادی. من بیشتر از یک هفته بود که درگیر این کوئری بودم و اینقدر پیچیده بودنش به این خاطره که سطرهایی که null هستند و یا تکراری هستند رو حذف کنم و کسی هم متاسفانه بهم کمکی نکرد. روشی که شما فرمودین من به این صورت نوشتم
select dbo.GetShamsiDate([date]), sum(case Fault when 'valid' then 1 else 0 end) as 'valid',
sum(case Fault when 'defective' then 1 else 0 end) as 'defective',
sum(case Fault when 'repair' then 1 else 0 end) as 'repair'


from BarCode
where .....
group by dbo.GetShamsiDate([date])

و دقیقا همون جوابو گرفتم. ممنون از لطفت.