View Full Version : custom query
مهدی هادیان2
دوشنبه 03 بهمن 1390, 16:59 عصر
بسم الله الرحمن الرحیم
با سلام
رابطه بین دو جدول کالا و گروه n به n است بنابراین جدولی واسط بین اینها گرفتم که کدکالا و کدگروه در آن قرار دارد
به ازای هر گروه کالا یه سطر اضافه می کند
حالا من میخوام کوئری بزنم طوری که تمام گروه های یک کالا را در یک سطر بدهد نه در چند سطر
چه جوری این کار را کنم؟
کدکالا کدگروه
1 5
1 6
خواسته من
کدکالا کدگروه کدگروه
1 5 6
در ضمن هر کالایی تنها 2گروه داره
یوسف زالی
سه شنبه 04 بهمن 1390, 17:43 عصر
اگر نعداد گروهها معلوم باشه به راحتی می تونید با چند تا ساب سلکت به منظورتون برسید.
select goodcode, (select top 1 code from group where relation = goodrel), (select top 1 code from group where relation = goodrel order by 1 desc) from goodsTBL
مهدی هادیان2
سه شنبه 04 بهمن 1390, 22:34 عصر
اگر نعداد گروهها معلوم باشه به راحتی می تونید با چند تا ساب سلکت به منظورتون برسید.
select goodcode, (select top 1 code from group where relation = goodrel), (select top 1 code from group where relation = goodrel order by 1 desc) from goodsTBL
با سلام
ساب سلکتی که گفته بودید زدم ارور زیر رو می ده و هیچ چیز به عنوان نتیجه نشون نمی ده
81394
یوسف زالی
سه شنبه 04 بهمن 1390, 23:30 عصر
به این دلیله که top رو درست نگذاشتید.
هردو باید top 1 باشند. دقیقا همون طور که نوشتم. یکی هم order باید داشته باشه.
مهدی هادیان2
چهارشنبه 05 بهمن 1390, 08:52 صبح
اگر نعداد گروهها معلوم باشه به راحتی می تونید با چند تا ساب سلکت به منظورتون برسید.
select goodcode, (select top 1 code from group where relation = goodrel), (select top 1 code from group where relation = goodrel order by 1 desc) from goodsTBL
میشه راجع به عملکردش توضیح بدید
چه جوری (select top 1 code from group where relation = goodrel order by 1 desc) از ادامه سلکت قبلی کار رو دنبال می کنه و نمیره اولین رکورد رو بازیابی کنه؛ دومی رو می کنه
لطفا راجع به تاپ هم توضیح بدید
آیا در ساب سلکت تنها میشه از یک ستون سلکت گرفت
در صورت منفی بودن پاسخ ارور زیر از چیست؟
چون به هر حال من رکوردهایی دارم که نال باشند
http://www.upload.iran-forum.ir/files/pics/pic1/13274771071.png
با تشکر
Galawij
چهارشنبه 05 بهمن 1390, 14:08 عصر
سلام،
روش دیگه برای این کار استفاده از FOR XML PATH هست، به ساختار Query زیر توجه کنید:
With Result AS (
SELECT IdContractingCompanyProfile,ContactNumber,CompanyN ame
FROM dbo.TbContractingCompanyContactNumbers INNER JOIN
dbo.TbTypesContactNumbers ON
dbo.TbContractingCompanyContactNumbers.Id_TypesCon tactNumbers = dbo.TbTypesContactNumbers.IdTypesContactNumbers INNER JOIN
dbo.TbContractingCompanyProfile ON
dbo.TbContractingCompanyContactNumbers.Id_Contract ingCompanyProfile = dbo.TbContractingCompanyProfile.IdContractingCompa nyProfile
)
SELECT IdContractingCompanyProfile,CompanyName,STUFF
((SELECT ', ' + CONVERT(nvarchar,Temp.ContactNumber)
FROM Result Temp
WHERE Result.IdContractingCompanyProfile=Temp.IdContract ingCompanyProfile FOR XML PATH('')), 1, 2, '') AS ContactNumber
FROM Result
Group By IdContractingCompanyProfile,CompanyName
ORDER BY IdContractingCompanyProfi
سه جدول داریم با نام های dbo.TbContractingCompanyContactNumbers و dbo.TbTypesContactNumbers و dbo.TbContractingCompanyProfile که به ازای هر شرکت چندین نوع شماره تماس داریم(ارتباط چند به چند). جستجو کنید متوجه می شید.
مهدی هادیان2
پنج شنبه 06 بهمن 1390, 16:47 عصر
سلام،
روش دیگه برای این کار استفاده از FOR XML PATH هست، به ساختار Query زیر توجه کنید:
With Result AS (
SELECT IdContractingCompanyProfile,ContactNumber,CompanyN ame
FROM dbo.TbContractingCompanyContactNumbers INNER JOIN
dbo.TbTypesContactNumbers ON
dbo.TbContractingCompanyContactNumbers.Id_TypesCon tactNumbers = dbo.TbTypesContactNumbers.IdTypesContactNumbers INNER JOIN
dbo.TbContractingCompanyProfile ON
dbo.TbContractingCompanyContactNumbers.Id_Contract ingCompanyProfile = dbo.TbContractingCompanyProfile.IdContractingCompa nyProfile
)
SELECT IdContractingCompanyProfile,CompanyName,STUFF
((SELECT ', ' + CONVERT(nvarchar,Temp.ContactNumber)
FROM Result Temp
WHERE Result.IdContractingCompanyProfile=Temp.IdContract ingCompanyProfile FOR XML PATH('')), 1, 2, '') AS ContactNumber
FROM Result
Group By IdContractingCompanyProfile,CompanyName
ORDER BY IdContractingCompanyProfi
سه جدول داریم با نام های dbo.TbContractingCompanyContactNumbers و dbo.TbTypesContactNumbers و dbo.TbContractingCompanyProfile که به ازای هر شرکت چندین نوع شماره تماس داریم(ارتباط چند به چند). جستجو کنید متوجه می شید.
از راهنمایی شما خیلی ممنون
اگه براتون امکان داره راجع به ساب سلکت و تاپی که You_see فرمودن هم توضیحاتی بفرمائید
البته همه دوستان مخاطب سوالم هستند
مهدی هادیان2
سه شنبه 18 بهمن 1390, 04:33 صبح
اگر نعداد گروهها معلوم باشه به راحتی می تونید با چند تا ساب سلکت به منظورتون برسید.
select goodcode, (select top 1 code from group where relation = goodrel), (select top 1 code from group where relation = goodrel order by 1 desc) from goodsTBL
با سلام
متوجه شدم که اگه موردی باشه که تنها یک گروه داشته باشه. این کوئری گروه دوم رو هم همون گروه اول میده
چه جوری میشه این مشکل رو رفع کرد؟
با تشکر
یوسف زالی
سه شنبه 18 بهمن 1390, 07:52 صبح
عرض کردم که اون برای مساله خاص شما بود.
راه حل کلی استفاده از داینامیک کوئری هست (چون هر ردیف به ستون تبدیل می شه نمی شه از xml path استفاده کرد)
می تونید موقتا برای رفع مشکل شرطی اضافه کنید که در صورت تک ردیفه بودن نال برگردونه.
اما بعدها دوباره شرایط مجبورتون خواهد کرد که فکر اصولی تری کنید.
اگر تمام ستونهای شما در یک ستون قابل ارائه بود xml path راه مناسبی هست.
baktash.n81@gmail.com
سه شنبه 18 بهمن 1390, 08:04 صبح
سلام
دوست عزیز یه جستجو برای Pivote بزن ... هم اینجا هم تو Help خود SQL
یوسف زالی
سه شنبه 18 بهمن 1390, 08:34 صبح
تا جایی که می دونم در Pivot باید تعداد فیلد ها معلوم باشه.
baktash.n81@gmail.com
سه شنبه 18 بهمن 1390, 10:34 صبح
تعداد مقدارهایی که فیلدی که قراره به صورت ستون تعریف بشه باید مشخص باشه ... که اونم می شه با داینامیک TSQL ساخت ...
مهدی هادیان2
سه شنبه 18 بهمن 1390, 19:46 عصر
عرض کردم که اون برای مساله خاص شما بود.
راه حل کلی استفاده از داینامیک کوئری هست (چون هر ردیف به ستون تبدیل می شه نمی شه از xml path استفاده کرد)
می تونید موقتا برای رفع مشکل شرطی اضافه کنید که در صورت تک ردیفه بودن نال برگردونه.
اما بعدها دوباره شرایط مجبورتون خواهد کرد که فکر اصولی تری کنید.
اگر تمام ستونهای شما در یک ستون قابل ارائه بود xml path راه مناسبی هست.
با سلام
از پاسختون ممنون
اگه می شه بگید شرطش رو چه جوری بنویسم
نمی دونم چه جوری تو ساب سلکت از if استفاده کنم
با تشکر
یوسف زالی
سه شنبه 18 بهمن 1390, 20:53 عصر
این مثال رو توسعه بدید به منظورتون می رسید:
declare @T table (SN int)
insert into @T
values(10)--, (20)
select top 5 Osn,
(selecttop 1 SN from @T),
(select top 1 SN from @T group by SN having COUNT(1)= 2 order by SN desc)
from TBL
مهدی هادیان2
چهارشنبه 19 بهمن 1390, 20:18 عصر
این مثال رو توسعه بدید به منظورتون می رسید:
declare @T table (SN int)
insert into @T
values(10)--, (20)
select top 5 Osn,
(selecttop 1 SN from @T),
(select top 1 SN from @T group by SN having COUNT(1)= 2 order by SN desc)
from TBL
با سلام
با راهنمایی شما کد زیر رو زدم
select CommodityCode,
(SELECT TOP (1) dbo.TreeGroups.Title
FROM dbo.TreeGroups INNER JOIN
dbo.CommodityGroup ON dbo.TreeGroups.GroupCode = dbo.CommodityGroup.GroupCode
WHERE (dbo.CommodityGroup.CommodityCode = dbo.Commodity.CommodityCode)) AS PrimaryGroupName,
(SELECT TOP (1) TreeGroups_1.Title
FROM dbo.TreeGroups AS TreeGroups_1 INNER JOIN
dbo.CommodityGroup AS CommodityGroup_1 ON TreeGroups_1.GroupCode = CommodityGroup_1.GroupCode
group by TreeGroups_1.Title
having COUNT(TreeGroups_1.GroupCode)= 2
) AS SubGroupName
from Commodity
ولی متاسفانه جواب نمی ده
ستون دوم تمام سطرها رو برابر اون سطری می گیره که شامل 2 گروه است
با تشکر
مهدی هادیان2
یک شنبه 23 بهمن 1390, 23:38 عصر
با سلام
چه تابعی در sql وجود داره که مثلا سطر دوم یه جدول رو بده
من مثال بالا رو نتونستم با top پیاده سازی کنم
می خوام از یه راه دیگه برم
با تشکر
مهدی هادیان2
دوشنبه 24 بهمن 1390, 21:05 عصر
با سلام
دوستان اگه راه دیگه ای دارید؛ لطفا بفرمائید
با تشکر
in_chand_nafar
سه شنبه 25 بهمن 1390, 07:32 صبح
دوست عزیز مسئاله شما
Pivots with Dynamic Columns in SQL Server
http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx
این یکی جالب یه SP برای اینکار ساخته
http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables
http://sqlblogcasts.com/blogs/madhivanan/archive/2008/08/27/dynamic-pivot-in-sql-server-2005.aspx
http://www.cftips.net/post.cfm/sql-pivot-table-with-dynamic-columns
http://www.kodyaz.com/articles/t-sql-pivot-tables-in-sql-server-tutorial-with-examples.aspx
امیدوارم با این لینک ها مشکلت حل بشه در صورتیکه مشکل حل نشد پیغام بده تا یه اسکریپت کوچولو و جمع جور برای اینکار داشتم که اون رو برات بفرستم
in_chand_nafar
سه شنبه 25 بهمن 1390, 12:21 عصر
این اسکریپت جالب و کوچولو رو یه نگاه بیانداز رکوردها را با کاما میچین کنار هم از متغییری که دیتا داخل اون ذخیره شده می تونی توی Pivot استفاده کنید برای آشنایی با Pivot هم می توانید از مقاله های و سوال و جواب های موجود در سایت استفاده کنید
USE NORTHWIND
--تعداد مشتري هاي كليه كشور ها را بدست آوريد
--IN توليد داده ها موجود در قسمت
DECLARE @X NVARCHAR(MAX)
SET @X=''
SELECT @x=@x+ISNULL(Country,'')+',' FROM Customers GROUP BY Country
PRINT @X
SET @X =LEFT(@X,len(@X)-1) --حذف كاما آخر
PRINT @X
---------------------------
EXEC ('SELECT * FROM
(SELECT Country,CustomerID FROM Customers) tmp
PIVOT (COUNT(CustomerID) FOR Country
IN ('+@X+')) AS pt')
--خروجي دستور براي تفهيم بيشتر
PRINT 'SELECT * FROM
(SELECT Country,CustomerID FROM Customers) tmp
PIVOT (COUNT(CustomerID) FOR Country
IN ('+@x+')) AS pt'
مهدی هادیان2
سه شنبه 25 بهمن 1390, 13:48 عصر
دوست عزیز مسئاله شما
Pivots with Dynamic Columns in SQL Server
http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx
این یکی جالب یه SP برای اینکار ساخته
http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables
http://sqlblogcasts.com/blogs/madhivanan/archive/2008/08/27/dynamic-pivot-in-sql-server-2005.aspx
http://www.cftips.net/post.cfm/sql-pivot-table-with-dynamic-columns
http://www.kodyaz.com/articles/t-sql-pivot-tables-in-sql-server-tutorial-with-examples.aspx
امیدوارم با این لینک ها مشکلت حل بشه در صورتیکه مشکل حل نشد پیغام بده تا یه اسکریپت کوچولو و جمع جور برای اینکار داشتم که اون رو برات بفرستم
با سلام
از پاسختون خیلی ممنون
تا این جایی که بنده بررسی کردم این مورد جواب گوی مسئله من نیست
برداشت من از pivot این بود که می توانم رکودهای موجود رو به عنوان هدر ستون ها در نظر بگیرم؛ در صورتی که من می خوام حالت زیر ایجاد شود
کد کالا؛ کد گروه ؛ کد گروه
1؛5؛6
با تشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.