0

コンテキストで実行される少しのaspコード。製品がオンラインであった開始年とアクティブな年数に基づいて、製品の販売実績を時系列に表します。たとえば、2000 年に発行された製品は、数年間販売のピークを迎えますが、2004 年までには販売がピークに達しません...しかし、これをコード化します。システム内のすべての製品と年ごとのグループ化です...(質問がある場合は、私が答えることができます。または、コードを見ると、それが何をしているのかについてかなりのアイデアが得られると思います!!)

まず、このクエリを実行してデータを取得します(変更したい):

    SELECT Products.ProductID, Products.AnticipatedSalesPattern, Convert(Char(10),Invoices.Date,103) As [date], Orders.Cost 
FROM (Orders INNER JOIN Products ON Orders.ProductID = Products.ProductID) 
INNER JOIN Invoices ON Orders.Invoice = Invoices.InvoiceNum 
WHERE (Products.IsResource=1 AND Orders.Returned<>1 AND Orders.Cost<>0) 
ORDER BY Products.ProductID, Invoices.Date;

データを(aspで)処理する方法は次のとおりです。モデリングデータをサンプリングするだけでは効果的ではないことはわかっています...

while not dbrecords.eof
    RecordsCount = RecordsCount + 1
if dbrecords("ProductID") <> LastPID then
    PIDsCount = PIDsCount + 1
    LastPID = dbrecords("ProductID")
    FirstSaleDate = dbrecords("Date")
    if month(FirstSaleDate) < 9 then
        FirstSchoolYear = Year(FirstSaleDate) - 1
    else
        FirstSchoolYear = Year(FirstSaleDate)
    end if
end if
YearsSinceFirstSale = int(DateDiff("d",FirstSaleDate,dbrecords("Date"))/365)
MyArray(FirstSchoolYear-2000,YearsSinceFirstSale) = MyArray(FirstSchoolYear-2000,YearsSinceFirstSale) + dbrecords("Cost")
MyArrayTotals(FirstSchoolYear-2000) = MyArrayTotals(FirstSchoolYear-2000) + dbrecords("Cost")
TotalSales = TotalSales + dbrecords("Cost")
dbrecords.movenext
wend

今私が気に入っているのは、データを配列に入れるプロセス全体と、年次データを返すクエリを削除することです

私が現在立ち往生しているのは、最初の販売から何年も経過するようにSQLを記述し、各製品を追跡することです(SQLでそれを実装する方法)。パラメーターはCTEステートメントを介して受け入れられると信じています...

また、これが他の方法ではるかに効率的に達成できると思うなら、それも素晴らしいでしょう

どんな助けでも大歓迎です...

これまでのところ、私は手に入れました。

これは、aspによって生成された同一のデータを提供しません...また、これを行うより良い方法があるかどうかを教えてください...

DROP VIEW inline_view;

GO

CREATE VIEW inline_view AS
  SELECT p2.ProductID, p2.AnticipatedSalesPattern, Invoices.Date, Orders.Cost, case when MONTH(date) < 9 then YEAR(date)-1 else YEAR(date) end   as year, 

  (select top 1 case when MONTH(i.date) < 9 then YEAR(i.date)-1 else YEAR(i.date) end from Invoices i inner join Orders o on i.InvoiceNum=o.Invoice
    inner join Products p on o.ProductID = p.ProductID where p2.ProductID = p.productID order by i.Date asc)  as startsale

FROM (Orders INNER JOIN Products p2 ON Orders.ProductID = p2.ProductID) 
INNER JOIN Invoices ON Orders.Invoice = Invoices.InvoiceNum 
WHERE (p2.IsResource=1 AND Orders.Returned<>1 AND Orders.Cost<>0)
;

GO

SELECT * FROM (
select SUM(cost) sum, datediff(y, startsale, year) as year, startsale  from inline_view 
group by year, startsale
) as data

PIVOT
(
    sum(sum)
--years after product is online
    FOR year IN ([1], [2], [3],[4],[5],[6],[7],[8],[9], [10],[11], [12])
) as pvt;
4

0 に答える 0