View Full Version : crosstab query - pivot
  
dell816
چهارشنبه 30 بهمن 1387, 15:54 عصر
سلام:
در sql server 2000
فرض کنید جدولی داریم با فیلدهای date,ccode,goodcode,amount میخواهیم یک view  بصورت زیر داشته باشیم:
               12/10/87        15/10/87       16/10/87  . . . . . . . . .
----------------------------------------------------------------------------
پنیر          10                     3                   15  
ماست        5                     0                  17   . . . . . . . . . . . . .
0
0
0
تعداد سطر و ستونها مشخص نیست ممکنست بیشتر باشد.
ممنون میشم راهنماییی کنید
reza_Nazem
پنج شنبه 01 اسفند 1387, 20:12 عصر
pivot رو در sql 2000 جستجو کن یه مثال کامل  گذاشته 
من خودم واسه لیست حقوق ازش استفاده کردم الان متاسفاته source رو ندارم اگر کارت راه نیفتاد بگو واست مثالش رو بذارم
dell816
پنج شنبه 01 اسفند 1387, 21:07 عصر
ممنون :
ولی مثالی که گذاشته مقدار ثابت داده و جالب نیست.
میشه این مثال را برام حل کنید.
AminSobati
پنج شنبه 01 اسفند 1387, 23:16 عصر
دوست عزیزم،
متاسفانه جز استفاده از Dynamic TSQL راهی نداره
reza_Nazem
شنبه 03 اسفند 1387, 22:14 عصر
script جدولت رو بذار اینجا شاید بتونم کمکی بهت کنم
dell816
یک شنبه 04 اسفند 1387, 08:52 صبح
اینهم script جدول
dell816
دوشنبه 05 اسفند 1387, 17:29 عصر
دوست عزیزم،
متاسفانه جز استفاده از Dynamic TSQL راهی نداره
میشه راهنمایی بفرمایید.؟ دلاوریان
reza_Nazem
جمعه 09 اسفند 1387, 00:04 صبح
DECLARE @StrDate char(10)
DECLARE @sqltext1 nvarchar(4000)
DECLARE @sqltext2 nvarchar(4000)
SET @sqltext1 =''
SET @sqltext2 =''
DECLARE Cur CURSOR
	local forward_only static
	FOR
	SELECT DISTINCT StrDate FROM ORD 
	
OPEN cur
FETCH cur INTO  @StrDate
	
WHILE @@FETCH_STATUS = 0 
BEGIN
	IF len(@sqltext1) < 3900
	BEGIN
		SET @sqltext1 = @sqltext1 +' sum(CASE WHEN StrDate = ''' +@StrDate+''' THEN Amount ELSE 0 END ) AS ['+@StrDate +'],' + char(13)
	END
	ELSE
	BEGIN
		SET @sqltext2 = @sqltext1 +' sum(CASE WHEN StrDate = ''' +@StrDate+''' THEN Amount ELSE 0 END ) AS ['+@StrDate+'],'+ char(13)	
	END	
		
		
	FETCH cur INTO  @StrDate
end	
	
CLOSE cur
DEALLOCATE cur
IF len(@sqltext2) > 0 
BEGIN
	SET @sqltext2 = substring( @sqltext2 , 1 , len(@sqltext2) - 2 )
END
ELSE
BEGIN
	SET @sqltext1 = substring( @sqltext1 , 1 , len(@sqltext1) - 2  )	
END	
		
exec(' select GoodCode, ' + @sqltext1 + @sqltext2 + '  FROM ORD GROUP BY GoodCode ')
به نظر من این شکل گزارش گیری غیر منطقی است معمولا امار فروش را برای ماه های سال گزارش می دهند و نه برای تمام روز های سال
در ضمن اگر در جدولت تعداد تاریخ های زیادی داشته باشی این query با مشکل مواجه خواهد شد
اگر به کد یک نگاهی بندازی خودت دلیلش رو می فهمی
در ضمن امکان تبدیل مستقیم این کد به یک view نیست می توانید در یک sp از ان استفاده کنی
HAMRAHSOFT.IR
جمعه 09 اسفند 1387, 13:58 عصر
دوستان میشه یک نمونه ساد از کوئریcrosstab بزارید تا هم من و هم بقیه دوستان بشتر متوجه ساخت اینو کئری باشیم
dell816
یک شنبه 11 اسفند 1387, 08:41 صبح
درست میفرمایید ولی من یه چیزی رو یادم رفت بگم . این کوئری برای داشتن سه فاکتور اخیر مشتری میباشد . حالت سوابق مشتری یعنی یک مشتری در سه فاکتور اخیرش چقدر خرید کرده
آیا میشه این کد را ساده تر کرد؟
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.