tefos666
شنبه 03 تیر 1391, 15:36 عصر
88650
با سلام - بنده دو جدول دارم که یکی شامل عناوین فاکتور (مشخصات مشتری - تاریخ و ...) می باشد و دیگری شامل اقلام فاکتور (کالاهایی که خرید کرده) - چون برای 1 شماره فاکتور n قلم جنس وارد می گردد لذا رابطه 1 به n دارند ، این 2 جدول با استفاده از 3 کلید بهم دیگر متصل شده اند ، حال بنا به دلایلی بنده نیاز به آن پیدا کرده ام که از تابعی مثل rownumber استفاده نمایم به صورتی که مثلا ش فاکتور 333 اگر در جدول دوم 10 بار تکرار شده فیلد link_ID آن 10 بار 1 شود و کالای دوم اگر ش ف 334 تعداد 4 بار بود فیلد link_ID در تمام سطرهایی که هرجا 334 بود Rownumber آن 2 شود یعنی به صورت دقیقتر مثل partion by عمل کند ، با این تفاوت که علاوه بر حفظ ترتیب rownumber هرجا ش فاکتور عوض شد rownumber عوض شود در غیر اینصورت rownumber تکرار شود
راهی که بنده به ذهنم رسید یک group by زدم بروی جدول اقلام فاکتور و شماره فاکتور را بهمراه تعداد تکرارش در آوردم ، حالا می خواهم اساتید کمک کنند تا با استفاده از یک کرسر و یا هرروش دیگری بروی select دوم فیلد link_ID را به صورت ذکر شده update کنم - نمونه کار هم به تصویر ضمیمه شده - باتشکر
--- avoid orderno
Declare @temp nvarchar(1000)
SELECT dbo.OrderDetail.OrderNo, COUNT(dbo.OrderDetail.OrderNo) AS tedad, dbo.OrderHeader.StrDate
FROM dbo.OrderDetail INNER JOIN
dbo.OrderHeader ON dbo.OrderDetail.OrderNo = dbo.OrderHeader.OrderNo AND dbo.OrderDetail.OrderTypeNo = dbo.OrderHeader.OrderTypeNo AND
dbo.OrderDetail.FinancYear = dbo.OrderHeader.FinancYear
GROUP BY dbo.OrderDetail.OrderNo, dbo.OrderHeader.StrDate
HAVING (dbo.OrderHeader.StrDate BETWEEN '1391/01/01' AND '1391/01/01')
-- avoid sale doc to update
SELECT @temp as [Lnk_ID], row_number()OVER ( PARTITION BY dbo.OrderHeader.OrderNo,dbo.OrderHeader.StrDate ORDER BY
dbo.OrderHeader.StrDate) AS RowNumber ,dbo.OrderHeader.TitleCode2,dbo.OrderHeader.Detail code2,dbo.OrderHeader.StrDate,dbo.OrderHeader.Orde rNO
,dbo.OrderDetail.GoodCode
FROM dbo.OrderDetail INNER JOIN
dbo.OrderHeader ON dbo.OrderDetail.OrderNo = dbo.OrderHeader.OrderNo AND dbo.OrderDetail.OrderTypeNo = dbo.OrderHeader.OrderTypeNo AND
dbo.OrderDetail.FinancYear = dbo.OrderHeader.FinancYear
where (dbo.OrderHeader.StrDate between '1391/01/01' and '1391/01/01')
and (dbo.OrderHeader.OrderNo=dbo.OrderDetail.OrderNo)
and (dbo.OrderHeader.OrderTypeNo=dbo.OrderDetail.Order TypeNo)
and (dbo.OrderHeader.FinancYear=dbo.OrderDetail.Financ Year)
order by dbo.OrderHeader.OrderNO
-- use curser
با سلام - بنده دو جدول دارم که یکی شامل عناوین فاکتور (مشخصات مشتری - تاریخ و ...) می باشد و دیگری شامل اقلام فاکتور (کالاهایی که خرید کرده) - چون برای 1 شماره فاکتور n قلم جنس وارد می گردد لذا رابطه 1 به n دارند ، این 2 جدول با استفاده از 3 کلید بهم دیگر متصل شده اند ، حال بنا به دلایلی بنده نیاز به آن پیدا کرده ام که از تابعی مثل rownumber استفاده نمایم به صورتی که مثلا ش فاکتور 333 اگر در جدول دوم 10 بار تکرار شده فیلد link_ID آن 10 بار 1 شود و کالای دوم اگر ش ف 334 تعداد 4 بار بود فیلد link_ID در تمام سطرهایی که هرجا 334 بود Rownumber آن 2 شود یعنی به صورت دقیقتر مثل partion by عمل کند ، با این تفاوت که علاوه بر حفظ ترتیب rownumber هرجا ش فاکتور عوض شد rownumber عوض شود در غیر اینصورت rownumber تکرار شود
راهی که بنده به ذهنم رسید یک group by زدم بروی جدول اقلام فاکتور و شماره فاکتور را بهمراه تعداد تکرارش در آوردم ، حالا می خواهم اساتید کمک کنند تا با استفاده از یک کرسر و یا هرروش دیگری بروی select دوم فیلد link_ID را به صورت ذکر شده update کنم - نمونه کار هم به تصویر ضمیمه شده - باتشکر
--- avoid orderno
Declare @temp nvarchar(1000)
SELECT dbo.OrderDetail.OrderNo, COUNT(dbo.OrderDetail.OrderNo) AS tedad, dbo.OrderHeader.StrDate
FROM dbo.OrderDetail INNER JOIN
dbo.OrderHeader ON dbo.OrderDetail.OrderNo = dbo.OrderHeader.OrderNo AND dbo.OrderDetail.OrderTypeNo = dbo.OrderHeader.OrderTypeNo AND
dbo.OrderDetail.FinancYear = dbo.OrderHeader.FinancYear
GROUP BY dbo.OrderDetail.OrderNo, dbo.OrderHeader.StrDate
HAVING (dbo.OrderHeader.StrDate BETWEEN '1391/01/01' AND '1391/01/01')
-- avoid sale doc to update
SELECT @temp as [Lnk_ID], row_number()OVER ( PARTITION BY dbo.OrderHeader.OrderNo,dbo.OrderHeader.StrDate ORDER BY
dbo.OrderHeader.StrDate) AS RowNumber ,dbo.OrderHeader.TitleCode2,dbo.OrderHeader.Detail code2,dbo.OrderHeader.StrDate,dbo.OrderHeader.Orde rNO
,dbo.OrderDetail.GoodCode
FROM dbo.OrderDetail INNER JOIN
dbo.OrderHeader ON dbo.OrderDetail.OrderNo = dbo.OrderHeader.OrderNo AND dbo.OrderDetail.OrderTypeNo = dbo.OrderHeader.OrderTypeNo AND
dbo.OrderDetail.FinancYear = dbo.OrderHeader.FinancYear
where (dbo.OrderHeader.StrDate between '1391/01/01' and '1391/01/01')
and (dbo.OrderHeader.OrderNo=dbo.OrderDetail.OrderNo)
and (dbo.OrderHeader.OrderTypeNo=dbo.OrderDetail.Order TypeNo)
and (dbo.OrderHeader.FinancYear=dbo.OrderDetail.Financ Year)
order by dbo.OrderHeader.OrderNO
-- use curser