PDA

View Full Version : crosstab query - pivot



dell816
چهارشنبه 30 بهمن 1387, 14: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, 19:12 عصر
pivot رو در sql 2000 جستجو کن یه مثال کامل گذاشته
من خودم واسه لیست حقوق ازش استفاده کردم الان متاسفاته source رو ندارم اگر کارت راه نیفتاد بگو واست مثالش رو بذارم

dell816
پنج شنبه 01 اسفند 1387, 20:07 عصر
ممنون :
ولی مثالی که گذاشته مقدار ثابت داده و جالب نیست.
میشه این مثال را برام حل کنید.

AminSobati
پنج شنبه 01 اسفند 1387, 22:16 عصر
دوست عزیزم،
متاسفانه جز استفاده از Dynamic TSQL راهی نداره

reza_Nazem
شنبه 03 اسفند 1387, 21:14 عصر
script جدولت رو بذار اینجا شاید بتونم کمکی بهت کنم

dell816
یک شنبه 04 اسفند 1387, 07:52 صبح
اینهم script جدول

dell816
دوشنبه 05 اسفند 1387, 16:29 عصر
دوست عزیزم،
متاسفانه جز استفاده از Dynamic TSQL راهی نداره

میشه راهنمایی بفرمایید.؟ دلاوریان

reza_Nazem
پنج شنبه 08 اسفند 1387, 23: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, 12:58 عصر
دوستان میشه یک نمونه ساد از کوئریcrosstab بزارید تا هم من و هم بقیه دوستان بشتر متوجه ساخت اینو کئری باشیم

dell816
یک شنبه 11 اسفند 1387, 07:41 صبح
درست میفرمایید ولی من یه چیزی رو یادم رفت بگم . این کوئری برای داشتن سه فاکتور اخیر مشتری میباشد . حالت سوابق مشتری یعنی یک مشتری در سه فاکتور اخیرش چقدر خرید کرده
آیا میشه این کد را ساده تر کرد؟