PDA

View Full Version : خطا در ایجاد جدول pivot



khorsandreza
یک شنبه 25 تیر 1396, 19:23 عصر
سلام دوستان من یک جدول دارم به شکل زیر

145776

حال می خواهم از فیلد Name بعنوان عناوین ستون ها و فیلد Value مقادیر ستون ها باش از صبح کلافه ام کرده اگر دوستان راهنمائی بکنند ممنون میشوم

fakhravari
یک شنبه 25 تیر 1396, 20:52 عصر
https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot

khorsandreza
یک شنبه 25 تیر 1396, 21:15 عصر
https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot
ممنون از راهنمائیتان این ها را دیدم اگر دقت کنید این جدول ساختار خاصی دارد

Mahmoud.Afrad
یک شنبه 25 تیر 1396, 22:50 عصر
کوئری خودتون چیه؟ خطا؟

و چرا ساختار جدول به اینصورت هست؟

khorsandreza
یک شنبه 25 تیر 1396, 23:18 عصر
SELECT prnt, [34] AS cesr, [1] AS lnam, [2] AS fnam, [4] AS dtav, [25] AS adrs
FROM (SELECT Name,Value,NameCode,prnt FROM TestP) p
PIVOT
( COUNT (name)
FOR NameCode IN( [34], [1], [2], [4], [25] )
) AS pvt

یه برنامه نویس و یه شرکت حرفه (ارایورز) این برنامه را نوشته به ازای هر فرد 35 رکورد ذخیره میشه :قهقهه:
تصویر زیر اطلاعات یک نفر است
145778

Mahmoud.Afrad
دوشنبه 26 تیر 1396, 01:11 صبح
آخه چنین ساختاری وقتی استفاده میشه که خصوصیات(نام، نام خانوادگی،...) تعداد مشخصی نداشته باشند مثلا برای ذخیره اجناس با ویژگی های متفاوت. در ثانی اشتباه دیگر برنامه نویس این برنامه این بوده که سطرهایی که value اونها null بوده اصلا نیاز به ذخیره سازی نداشته اند. و سوم اینکه ستون Name کلا اضافه هست(حجم زیادی فقط برای مقادیر تکراری این ستون هدر میره) و میتونست در یک جدول دیگر باشه و با ستون namecode جوین بشه.

اما در مورد کوئری، لینک زیر دقیقا مشابه سوال شما رو جواب دادم. منتها در اون کد یک rownumber اضافه کردم که برای شما نیاز نیست و به جاش از namecode استفاده کنید.
http://barnamenevis.org/showthread.php?531915-%D9%88%D8%A7%DA%A9%D8%B4%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D8%AA%D9%84%D9%81%D9%86-%D8%A8%D8%A7-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%88-%D9%86%D8%A7%D9%85%D9%87%D8%A7%DB%8C-%DB%8C%DA%A9%D8%B3%D8%A7%D9%86-%D9%88-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%AF%D8%B1-%D8%AC%D9%84%D9%88%DB%8C-%D9%87%D8%B1-%D9%86%D8%A7%D9%85&p=2348571&viewfull=1#post2348571

khorsandreza
دوشنبه 26 تیر 1396, 09:40 صبح
سلام با تشکر از اینکه زحمت کشیدید راهنمائی کردید من مطابق شکل راهنمائی های شما انجام دادم

select namecode,
max([34]) ,
max([1]) ,
max([2]) ,
max([4]) ,
max([25]))
from
( select namecode, [34] AS cesr, [1] AS lnam, [2] AS fnam, [4] AS dtav, [25] AS adrs
from testp
pivot ( max(pk_id)
for namecode in([34], [1], [2], [4], [25])
) as pppp
)


خطا میده و یا من شکل دستورات را اشتباه طراحی کردم ببیند این جدول را طوری طراحی کردن که اگر نیاز به فیلد جدیدی در مشخصات فردی بود خود کاربر بتواند تولید کند و نرم افزار به ازای فیلد تولید شده یک ادیت باکس و کمبو باکس به اینترفیس اضافه می کند من می خواهم از روی این جدول یک ویو طراحی کنم کار از 35 رکور هر کدام را از لیست باک انتخاب کرد بصورت یک رکورد نشان بدهد ستون Name بعنوان عناوین ستون ها و ستون Value بعنوان مقادیر هر رکورد نمایش داده بشود ستون "کد شناسه" در تمام گزارش ها اورد خواهد شد ولی بقیه فیلدها اختیاری باشد و براساس خواسته کاربر تغییر یابد
یعنی بشکل زیر باشد

Mahmoud.Afrad
دوشنبه 26 تیر 1396, 10:38 صبح
SELECT
max([1]) as lastname,
max([2]) as FirstName,
max([3]) as Alias,
max([4]) as BirthDate,
max([5]) as BirthPlace,
prnt
FROM [TableName]
PIVOT
(
max(value)
FOR namecode IN ([1] ,[2] ,[3] ,[4] ,[5])
) AS pivottable
group by prnt

چون تعداد مشخصات ثابت نیست و ممکنه بیشتر بشه باید کوئری را به صورت داینامیک ایجاد کنید. در موردش میتونید جستجو کنید. البته در اینصورت کوئری مستعد نفوذ خواهد شد(sql injection) که باز میتونید در موردش جستجو کنید.

khorsandreza
دوشنبه 26 تیر 1396, 11:16 صبح
ممنون دقیقا همین را میخواستم
دقیقا منظورتان از "(sql injection)" را متوجه نشدم البته میدانم برای تزریق بعضی کدها برای لاگین و این نوع کارها ولی در اینجا خیلی متوجه نشدک البته اطلاعات من روی بستر اینترنت نیست رو سرور داخلی هست