PDA

View Full Version : گروه بندی عجیب



simorgh-hossein
جمعه 27 دی 1392, 01:04 صبح
سلام دوستان
من 2 تا جدول دارم که اطلاعات این 2 جدول رو بصورت زیر join میکنم !!!

http://azarinsystem.ir/1.jpg

حالا میخوام گروه بندی انجام بدم که بدین شرط : آنهایی که باهم فامیل هستند رو بصورت زیر لیست کند و مچموع قیمت را در یک فیلد جمع کند و فیلد بعدی را خالی بگذارد .!

بصورت زیر :

http://azarinsystem.ir/2.jpg

آیا راهی هست که بشه همچین کاری انجام داد ؟؟؟ :متفکر:

simorgh-hossein
جمعه 27 دی 1392, 23:09 عصر
خیلی سخته میدونم !!! :گریه:

ولی ممنون میشم یکی بهم کمک کنه !!! :لبخندساده:

N_D
شنبه 28 دی 1392, 09:08 صبح
فامیل بودن رو از کجا میخوای بفهمی.. سیستم اتوماتیک که نمیتونه بفهمه چون اسمها و فامیلی های مرکب کار خراب کن هستند برای نمونه در مثال بالا اگه یه نفر بیاد بنام" امیر علی احمدی" ... اونوقت این آقا علی- امیراحمدی هست یا امیر علی - احمدی.... یه کدی بزار اونوقت چیزی که میخوای رو میشه انجام داد... در ضمن اسکریپت تولید دیتا رو هم اینجا بنویس

N_D
شنبه 28 دی 1392, 09:22 صبح
این هم کد


Create table #TEMP (GrpFamily int, IDCARD int, FullName nvarchar(100), Price int)
INSERT #TEMP VALUES
(1 , 111111111,'امیر فرهادی' ,1000) ,
(1 , 222222222,'ساسان فرهادی' ,2500) ,
(2 , 333333333,'رضا یاری' ,7500) ,
(2 , 444444444,'کامران یاری' ,4500) ,
(2 , 555555555,'مهدی یاری' ,1500) ,
(3 , 666666666,'علی قاسمی' ,3000) ,
(3 , 777777777,'اکبر قاسمی' ,2000) ,
(3 , 888888888,'مهدی قاسمی' ,4000) ,
(4 , 999999999,'فرشاد شاکری' ,2500);

SELECT
GrpFamily,IDCARD,FullName,Price, CASE RowNO WHEN 1 THEN FamilyPrice ELSE NULL END as FamilyPrice
FROM
(
SELECT
GrpFamily,IDCARD,FullName,Price
, SUM(Price) OVER(PARTITION BY GrpFamily) as FamilyPrice
, ROW_NUMBER() OVER(PARTITION BY GrpFamily ORDER BY (SELECT NULL)) as RowNO
FROM #TEMP
) Tbl
drop table #TEMP

simorgh-hossein
یک شنبه 29 دی 1392, 00:21 صبح
دوست عزیز بابت پاسختون ممنون !!!! :قلب:

شرمنده فقط چندتا سوال داشتم ازتون ! :خجالت:

من تا بحال از کلمات کلید OVER و PARTITION BY استفاده نکرده بودم ، ممنون میشم توضیح کوتاه در مورد این کلمات و کدتون بفرمائید !

راستی منظور از Tbl که در آخر کد اومده ، چیه ؟؟؟؟ :متفکر:

starting
دوشنبه 30 دی 1392, 00:02 صبح
از حل این مساله لذت بردم:

;WITH C1 AS
(
SELECT GrpFamily, SUM(Price) AS total, MIN(IDCARD) AS mn
FROM #temp
GROUP BY GrpFamily
)
SELECT t.*,
total FamilyPrice
FROM #temp t
LEFT JOIN C1
ON t.grpFamily = C1.grpFamily
AND mn = IDCARD;