PDA

View Full Version : مشکل در گروه بندی رکوردها



spring69
سه شنبه 17 فروردین 1389, 18:54 عصر
سلام.
من میخوام در دستور زیر، داده ها رو بر اساس فیلد innerjoin.code گروه بندی کنم:


SELECT
innerjoin.Id, innerjoin.TarikhSabt AS [تاريخ ثبت], innerjoin.TarikhMoamele AS [تاريخ معامله], innerjoin.Serial AS سريال, dbo.View_Cars.نام AS [نام اتومبيل],
dbo.View_Cars.مدل AS [مدل اتومبيل], dbo.View_Cars.[شماره شهرباني], dbo.View_Cars.رنگ, dbo.View_Cars.[شماره موتور], dbo.View_Cars.[شماره شاسي], dbo.View_Cars.[نام مالك],
dbo.View_Cars.[فاميلي مالك], dbo.View_Cars.[شماره ملي مالك], dbo.View_Cars.[نام پدر مالك], dbo.View_Cars.[شماره شناسنامه مالك], dbo.View_Cars.[تلفن مالك],
dbo.View_Persons.نام AS [نام فروشنده], dbo.View_Persons.[نام خانوادگي] AS [نام خانوادگي فروشنده], dbo.View_Persons.[شماره ملي] AS [شماره ملي فروشنده],
dbo.View_Persons.[نام پدر] AS [نام پدر فروشنده], dbo.View_Persons.[شماره شناسنامه] AS [شماره شناسنامه فروشنده], dbo.View_Persons.تلفن AS [تلفن فروشنده],
View_Persons_1.نام AS [نام خريدار], View_Persons_1.[نام خانوادگي] AS [نام خانوادگي خريدار], View_Persons_1.[شماره ملي] AS [شماره ملي خريدار],
View_Persons_1.[نام پدر] AS [نام پدر خريدار], View_Persons_1.[شماره شناسنامه] AS [شماره شناسنامه خريدار], View_Persons_1.تلفن AS [تلفن خريدار], dbo.View_Cars.كيلومتر,
dbo.View_Cars.ID AS Expr1, dbo.View_Persons.ID AS Expr2, View_Persons_1.ID AS Expr3, innerjoin.Code
FROM dbo.tblMoamele AS innerjoin INNER JOIN
dbo.View_Cars ON innerjoin.CarID = dbo.View_Cars.ID INNER JOIN
dbo.View_Persons ON innerjoin.Id = dbo.View_Persons.ID INNER JOIN
dbo.View_Persons AS View_Persons_1 ON innerjoin.KharidarID = View_Persons_1.ID
بانکم رو هم قراردادم.
در view_moamele میخوام این کار رو انجام بدم.
ممنون میشم کمکم کنید.

محمد سلیم آبادی
پنج شنبه 19 فروردین 1389, 01:54 صبح
سلام،
اول از همه فایل ضمیمه شده مشکل داره.
اگر بخواهین تنها بر اساس ستون innerjoin.code گروه بندی انجام بدین بایستی دیگر ستون های آن جدول رو داخل توابع تجمعی استفاده کنین.

از کدتتان پیداست که این query را توسط Query Builder که زمان ساخت View استفاده میشود ساخته این. استفاده از Query Builder برای Query های نسبتا پیجیده مناسب نیست.

در ضمن برای اینکه دقیق بدانیم چه نتیجه ای انتظار دارین بایستی یک نمونه از داده ها و نتیجه ی مورد نظرتون را ارسال کنین.

spring69
پنج شنبه 19 فروردین 1389, 10:06 صبح
با تشکر از پاسختون.
فابل sql server 2005 express هست. البته من در وبندوز 7 بکاپ رو گرفتم.
من سه تا جول دارم:
1- جدول persons
2- جدول cars
3- جدول معامله


tblpersons
id
name
..

tblcars
id
personid
..

tblmoamele
id
kharidarid
forooshandeid
code
..


در هر معامله ممکنه حالت های زیر ایجاد بشه:
1- یک فروشنده ، یک خریدار
2- یک فروشنده ، دو خریدار
3- دو فروشنده ، یک خریدار

حالا من فیلد code رو به صورت زیر استفاده میکنم.
مثلا در یک معامله، دو فروشنده 1 و 2 و دو خریدار 3 و 4 وجود دارند. من این معامله رو به صورت زیر ذخیره میکنم:

tblmoamele
id:1
kharidarid:3
forooshandeid:1
code:1
---------------------------------------
id:2
kharidarid:3
forooshandeid:2
code:1
---------------------------------------
id:3
kharidarid:4
forooshandeid:2
code:1
--------------------------------------

حالا برای نمایش اونا باید این سه رکورد رو، یک رکورد نمایش بده.
البته من در برنامه فیلد id رو نمایش نمی دم.
لطفا منو راهنمایی کنید.

محمد سلیم آبادی
پنج شنبه 19 فروردین 1389, 12:43 عصر
مثلا در یک معامله، دو فروشنده 1 و 2 و دو خریدار 3 و 4 وجود دارند

دو فروشنده ی 1 و 2 محصول خودشون رو با دو خریدار 3 و 4 معامله می کنند. درسته؟ که با توضیحات شما چهار حالت(سطر) (نه سه حالت) باید بوجود بیاد (که دقیقا ضرب دکارتی یا cross join صورت گرفته):
خریدار:3 فروشنده:1
خریدار:3 فروشنده:2
خریدار:4 فروشنده:1
خریدار:4: فروشنده:2


حالا برای نمایش اونا باید این سه رکورد رو، یک رکورد نمایش بده.
لطفا نتیجه ی مورد نظری که از این چهار سطر انتظار دارین رو نمایش بدین تا دقیق تر به مشکلتان رسیدگی شود.

spring69
پنج شنبه 19 فروردین 1389, 17:37 عصر
با تشکر.
آره همون چهار حالت که شما گفتید درسته.
میخوام این نتیجه رو نمایش بده:

nameforooshandre1
nameforooshande2
namekharidar1
namekharidar2
namecar
namemalekecar

محمد سلیم آبادی
پنج شنبه 19 فروردین 1389, 17:41 عصر
فکر نمی کنید بازم اشتباه کردین؟
در نمونه ای که قرار دادین نام خریدار نباید 3 و 4 باشه به جای 1 و 2؟


nameforooshandre1




nameforooshande2

namekharidar1
namekharidar2
namecar
namemalekecar



در ضمن به مطلبی که قبلا پست کردین توجه کنید:

در هر معامله ممکنه حالت های زیر ایجاد بشه:
1- یک فروشنده ، یک خریدار
2- یک فروشنده ، دو خریدار
3- دو فروشنده ، یک خریدار

حالا من فیلد code رو به صورت زیر استفاده میکنم.
مثلا در یک معامله، دو فروشنده 1 و 2 و دو خریدار 3 و 4 وجود دارند. من این معامله رو به صورت زیر ذخیره میکنم

گفته شده ممکنه این 3 حالت بوجود بیاد. در صورتی که حالت دو فروشنده دو خریدار جز این حالات نیستند. چرا؟

spring69
پنج شنبه 19 فروردین 1389, 18:02 عصر
ببینید منظور من نام فروشنده اول (forooshande1)و نام فروشنده دوم (forooshande2)و نام خریدار اول(kharidar1) و نام خریدار دوم (kharidar2)(که از جدول اشخاص گرفته میشوند) و نام ماشین و نام مالک ماشین (که از جدول ماشین ها گرفته می شوند) بود.
گفتم که همون چهار حالت که شما نوشتید درسته:
1- یک فروشنده ، یک خریدار
2- یک فروشنده ، دو خریدار
3- دو فروشنده ، یک خریدار
4- دو فروشنده ، دو خریدار

محمد سلیم آبادی
پنج شنبه 19 فروردین 1389, 18:20 عصر
پس چهار حالت باید به این شکل دربیاد؟


f1 f2 kh1 kh2
---------------- ---------------- ------------- -------------
nameforooshande1 nameforooshande2 namekharidar1 namekharidar2
nameforooshande1 NULL namekharidar1 NULL
nameforooshande1 nameforooshande2 namekharidar1 NULL
nameforooshande1 NULL namekharidar1 namekharidar2

(4 row(s) affected)



یعنی زمانی در دو طرف یک معامله چهار نفر حضور ندارن مابقی ستونها خالی باقی می مانند؟

spring69
پنج شنبه 19 فروردین 1389, 18:34 عصر
كاملا درسته.
به همين شكل كه شما نوشتين.

محمد سلیم آبادی
پنج شنبه 19 فروردین 1389, 18:49 عصر
من نمودنم در Express این Syntax هایی که نوشتم پشتیبانی می شن یا نه.
اگر برای هر معامله چهار سطر درج شده باشه این کوئری به احتمال خیلی زیاد بایستی جواب بده.
امتحانش کنید:

;WITH Custom_Rank AS
(SELECT ROW_NUMBER() OVER(PARTITION BY Code ORDER BY forooshandeid ASC, kharidarid ASC) AS row_id , *
FROM tblmoamele)
SELECT MAX(CASE WHEN row_id = 1 THEN P1.name END) AS nameforooshande1,
MAX(CASE WHEN row_id = 2 THEN P1.name END) AS nameforooshande2,
MAX(CASE WHEN row_id = 3 THEN P2.name END) AS namekharidar1,
MAX(CASE WHEN row_id = 4 THEN P2.name END) AS namekharidar2,
MAX(Cars.nameCar) AS namecar,
MAX(Cars.person) AS namemalekecar
FROM Custom_Rank AS C
INNER JOIN tblpersons AS P1
ON C.kharidarid = P1.id
INNER JOIN tblpersons AS P2
ON C.forooshandeid = P2.id
INNER JOIN tblcars AS Cars
ON C.carID = Cars.ID
GROUP BY C.Code

spring69
پنج شنبه 19 فروردین 1389, 20:32 عصر
واقعا متشکرم.
بالاخره به لطف شما مشکلم حل شد.
من برای هر معامله سه سطر گذاشتم و خط های زیر رو یکم تغییر دادم:


SELECT MAX(CASE WHEN row_id = 1 THEN P1.name END) AS nameforooshande1,

MAX(CASE WHEN row_id = 2 THEN P1.name END) AS nameforooshande2,

MAX(CASE WHEN row_id = 3 THEN P2.name END) AS namekharidar1,

MAX(CASE WHEN row_id = 4 THEN P2.name END) AS namekharidar2,


و به این شکل نوشتم:



SELECT MAX(CASE WHEN row_id = 1 THEN P1.name END) AS nameforooshande1,
MAX(CASE WHEN row_id = 3 THEN P1.name END) AS nameforooshande2,
MAX(CASE WHEN row_id = 1 THEN P2.name END) AS namekharidar1,
MAX(CASE WHEN row_id = 2 THEN P2.name END) AS namekharidar2,