View Full Version : یک دستور select خاص
mehrzad007
چهارشنبه 10 اردیبهشت 1393, 10:34 صبح
از عنوان تاپیک عذر میخوام . عنوان بهتری به نظرم نرسید .
من یه بانک به حالت عکس زیر دارم :
http://www.uploadax.com/images/59527735402599998496.png
چون تعداد فیلد ها خیلی زیاده و همه اونا کاربردی نداره برنامه برای ذخیره اطلاعات از این روش استفاده کرده . ابتدا اسم کاربر بعد اسم فیلد بعد مقدار فیلد . هر زمان که فیلدی مربوط به کاربری توی برنامه اضافه بشه به ازای اون فیلد یه رکورد به بانک اضافه میشه . یعنی ممکنه به ازای یه کاربر ده تا رکورد باشه یا سه تا رکورد !
حالا من میخوام یه کوئری بنویسم که کاربرانی که تاریخ آخرین ورودشون مثلا از 1/1/2014 بیشتره و تمام اطلاعات ذخیره شدشون رو نمایش بده .
دستور select مربوطه به چه شکلی نوشته میشه ؟ >
mehrzad007
چهارشنبه 10 اردیبهشت 1393, 10:37 صبح
بتونید یه کی سرچ هم بهم بدین عالیه . این امکان رو بهش چی میگن ؟
N_D
چهارشنبه 10 اردیبهشت 1393, 11:00 صبح
اگه لیست options از قبل مشخص هست از روش زیر استفاده کن .. اگه هم دینامیک میخوای باید با EXEC کوئری رو بسازی( در اینجا فرض بر اینست که lمقدار Last In حتما از نوع date وارد می شود)
Create Table #T1(UserName nvarchar(10), Options nvarchar(10), Value nvarchar(10));
Insert #T1 Values
('a','tell','555'),
('a','pass','2880'),
('a','name','ali'),
('a','last chk','2014-01-01'),
('a','last in','2014-01-02'),
('b','pass','123'),
('b','name','reza'),
('b','last chk','2014-01-01'),
('b','last in','2014-01-05')
;
SELECT *
FROM(
SELECT UserName,[tell],[pass],[name],[last chk],[last in]
FROM ( SELECT UserName,Options,Value FROM #T1 ) A
PIVOT
( MAX(Value) FOR Options IN ([tell],[pass],[name],[last chk],[last in]) ) Pvt
) TBL
WHERE Cast([last in] as date ) >'2014-01-03'
drop table #T1
mehrzad007
چهارشنبه 10 اردیبهشت 1393, 11:46 صبح
lمقدار Last In حتما از نوع date وارد می شود
متاسفانه این فیلد هم از نوع تکست ه .
mehrzad007
چهارشنبه 10 اردیبهشت 1393, 16:27 عصر
ظاهرا مشکل من با کمک دستور pivot حل میشه . دستور بسیار جالبیه ! تا حالا باهاش برخورد نکرده بودم . باهاش کار کردم اما متاسفانه یه مورد جالب دارم . محتوای ستون option محتوی اینجور عبارتهاییه :
[global]name
sql به این عبارت گیر میده . این عبارت رو چطوری بنویسم ؟
SELECT *
FROM TAC_USR PIVOT (tav_val FOR tac_attr IN ([Global] Name, [Global] Groups, [Global] EMail, [Credits] KBytesLeft) AS mytbl
N_D
پنج شنبه 11 اردیبهشت 1393, 22:16 عصر
نمونه داده های جدولتو بصورت اسکریپت اینجا بنویس
اینجوری بهتر میتونیم کمک کنیم..
mehrzad007
جمعه 12 اردیبهشت 1393, 00:51 صبح
مهندس از توجهتون ممنونم . نگاه کنید این یه رکورد نمونه از دیتا بیسه :
http://www.uploadax.com/images/46245773910179558183.gif
من میخوام یه خروجی شبیه اینو داشته باشم :
http://www.uploadax.com/images/09372100281605127796.gif
فقط هم همین هفت فیلد رو میخوام الباقی موارد نیازی نیست بهش .
طبق توضیحات شما و یه سری راهنمایی که پیدا کردم اسکریپت بالا رو نوشتم اما کار نمی کنه .
اگر محبت کنید راهنمایی کنید منو ممنون میشم .
mehrzad007
جمعه 12 اردیبهشت 1393, 00:52 صبح
ضمنا دیتا بیس هم sql server 2005 هست .
N_D
شنبه 13 اردیبهشت 1393, 08:09 صبح
Create Table #T1(UserName nvarchar(20), Options nvarchar(20), Value nvarchar(20));
Insert #T1 Values
('a','[tell] NO','555'),
('a','pass','2880'),
('a','[First] name','ali'),
('a','[last] chk','2014-01-01'),
('a','[last] in','2014-01-02'),
('b','pass','123'),
('b','[First] name','reza'),
('b','[last] chk','2014-01-01'),
('b','[last] in','2014-01-05')
;
SELECT *
FROM(
SELECT "[tell] NO","pass","[First] name","[last] chk","[last] in"
FROM ( SELECT UserName,Options,Value FROM #T1 ) A
PIVOT
( MAX(Value) FOR Options IN ("[tell] NO","pass","[First] name","[last] chk","[last] in") ) Pvt
) TBL
WHERE Cast([last in] as date ) >'2014-01-03'
drop table #T1
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.