folani
چهارشنبه 16 اردیبهشت 1394, 23:03 عصر
سلام خدمت همه دوستان و مهندسی گرامی شرکت کننده در بحث
بنده به تازگی شروع به یادگیری عملی ms sql کرده ام و برای همین موضوع توانایی نوشتن سلکتهای تو در تو و انواع join را یادگرفته ام (هوراااااااا)
الان یک موردی مواجه شدم که کمی در نوشتن سلکت آن درمانده شده ام:
فرض کنید ما "یک" جدول به صورت زیر داریم:
میز
علی
رضایی
صندلی
علی
رضایی
تلفن
علی
رضایی
کمد
علی
رضایی
میز
محمد
احمدی
صندلی
محمد
احمدی
تلفن
محمد
احمدی
میز
حسین
کریمی
صندلی
حسین
کریمی
کمد
تقی
رمضانی
حالا من میخواهم یک سلکتی بنویسم که در آن اقلام اداری "میز" و "صندلی" و "تلفن" را مشخص کرده و ببینم کدام یک از پرسنل ذکر شده در فوق؛ همزمان "هر سه" این اقلام را تحویل گرفته اند. البته منعی ندارد اگر بیشتر از این سه قلم هم دریافت کرده باشند. برای همین خروجی این سلکت باید اینطوری باشد
محمد
احمدی
علی
رضایی
البته اگر بصورت زیر هم باشد که عالی عالی است
میز + صندلی + تلفن + کمد
علی
رضایی
میز + صندلی + تلفن
محمد
احمدی
از همه دوستان و متخصصین ممنون میشوم اگر به من کمک کنند. folani@ymail.com ایمیل بنده است
SabaSabouhi
پنج شنبه 17 اردیبهشت 1394, 07:32 صبح
سلام
شما که تازه شروع کردی به کار با Sql، ازت خواهش میکنم یه مقدار روی نرمال کردن دیتابیس هم مطالعه کنی.
این جدول که مثال زدی جدول نادرستی هست. برای این کار شما به سه جدول «اموال»، «اشخاص» و «اموال-اشخاص» نیاز داری
در مورد اون Query که گفتی، من متوجه منظور نمیشم، به چه دردی میخوره همچنین چیزی؟
اگه واقعاً نیاز هست که همچنین Query ای گرفته بشه، اول باید روش پرسش رو استاندارد کنی.
وقتی میگی اقلام «میز» و «صندلی» و «تلفن» آیا منظورت اینه که این سه قلم با بقیه اقلام فرق دارن؟
آیا این سه قلم HardCode شده؟ یا این که میتونی برای این پرسش از هر سه قلمی استفاده کنیم؟
آیا فقط 3 قلم؟ یا میشه برای 2 یا 4 یا 6 قلم هم این Query رو نوشت؟
در کل پرسشی که داره به نظر من استاندارد نیست، و برای پاسخ به پرسش غیر استاندارد، باید از روشهایی
مثل نوشتن Function یا Sp استفاده کنی، و معمولاً برای این نوع کارها Cursor نوشتن بهترین روش هست.
صبا صبوحی
folani
سه شنبه 29 اردیبهشت 1394, 22:26 عصر
بازهم متشکر از شما که یادی از این سوال کردید دی!
در مورد سوال شما مبنی بر اینکه آیا این سه قلم فرضی با بقیه اقلام فرق دارند؛ بایستی عرض کنم که حتماً همینطور است و هر کدام از این اقلام با یکدیگر متفاوت هستند.
در مورد اینکه گفتید؛ فقط این سه قلم؟ بایستی عرض کنم که خیر. اقلام در اختیار هر فرد میتواند تا یکصد مورد متفاوت افزایش یابد ولی نه بیشتر.
جناب مهندس؛ بنده به اشکالات فنی گرفته شده توسط جنابعالی حق میدهم اما خواهشم این است که فرض کنید با همه غیراستاندارد بودن طراحی جداول فوق یا هر چیز دیگر؛ اگر راه حلی برای همین مثال عینی وجود دارد؛ لطفا راهنمایی بفرمایید.
golbafan
پنج شنبه 31 اردیبهشت 1394, 11:19 صبح
برای اسامی افراد باید از group by استفاده کنید
برای ستون اقلام هم باید یک حلقه ای بنویسید تا متن مورد نظر رو براتون ایجاد کنه
اما در کل این روش خیلی نادرسته
بهتره به حرف آقای صبوحی گوش کنید!
esteghamat
دوشنبه 04 خرداد 1394, 15:49 عصر
سلام
در محدوده همین داده ها و همین صورت مساله می تونی این دو روش رو استفاده کنی . بهتره موارد بعد که خواستی سوال در مورد query بپرسی حتما ساختار جداول و داده های آزمایشی را بصورت اسکریپت آماده کن .
Create Table Tbl_Person
(PersId Int,
Fname Varchar(30),
Lname Varchar(50)
)
Go
Insert into Tbl_Person Values (1,'Ali','Rezaee')
Insert into Tbl_Person Values (2,'Mohammad','Ahmadi')
Insert into Tbl_Person Values (3,'Hossein','Karimi')
Insert into Tbl_Person Values (4,'Teghi','Ramezani')
GO
Select * from Tbl_Person
------------------------------------------
Create Table Tbl_Goods
(GoodsId Int,
Gname Varchar(30)
)
Go
Insert Into Tbl_Goods Values (100,'Table')
Insert Into Tbl_Goods Values (101,'Chair')
Insert Into Tbl_Goods Values (102,'Phone')
Insert Into Tbl_Goods Values (103,'Shelf')
select * from Tbl_Goods
---------------------------------------------
Create Table Tbl_PersonGoods
(PersId int ,
GoodsId int)
Insert into Tbl_PersonGoods Values(1 , 100)
Insert into Tbl_PersonGoods Values(1 , 101)
Insert into Tbl_PersonGoods Values(1 , 102)
Insert into Tbl_PersonGoods Values(1 , 103)
Insert into Tbl_PersonGoods Values(2 , 101)
Insert into Tbl_PersonGoods Values(2 , 102)
Insert into Tbl_PersonGoods Values(3 , 100)
Insert into Tbl_PersonGoods Values(3 , 101)
Insert into Tbl_PersonGoods Values(4 , 103)
-------------------------------------------------
select * from Tbl_PersonGoods
--1 -- Group By
Select P.PersId,P.Fname,P.Lname,Count(PG.GoodsId) Count_Goods From
Tbl_PersonGoods PG Inner Join Tbl_Person P On PG.persId=P.PersId Group BY P.PersId,P.Fname,P.Lname
--2 -- Pivot Table
--Select P.PersId,P.Fname,P.Lname,G.Gname From
;With BaseQuery
As
(Select P.PersId,P.Fname,P.Lname,G.Gname From
Tbl_PersonGoods PG Inner Join Tbl_Person P On PG.persId=P.PersId
Inner Join Tbl_Goods G On G.GoodsId = PG.GoodsId
)
Select PersId,Fname,Lname,[Table],Phone,Chair,Shelf From
BaseQuery PG
Pivot(Count(Gname) For Gname IN([Table],Chair,Phone,Shelf)) As PivotGoods
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.