2009-12-18 13 views
0

請幫助新手。 我正在閱讀存儲過程的最近兩年的銷售數據,顯示在asp.net網站上,它工作得很好。
問題在於不經常銷售的產品,我需要弄清楚哪些月份沒有任何銷售。在這種情況下,我需要在表格單元中放置零並移動到數據集中的下一行。
對於每個月沒有數據的情況下,每個人都不會這麼做。
問題是,如何移動到下一個sqlrow以及如何測試何時讀取了所有行?數據集和不存在的行

sqlSelect = "EXECUTE dealer_sales_statistics @productID = '" & strProdID.Value & "'" 
Dim sqlConn As New SqlConnection(sqlConnStr) 
Dim sqlRow As DataRow 
sqlConn.Open() 
Dim sqlAdapt As New SqlDataAdapter(sqlSelect,sqlConn) 
Dim sqlDataSet As New DataSet() 
sqlAdapt.Fill(sqlDataSet, "sales_statistics") 
Do Until sqlRow.EOF 
If intCounter < 12 Then 
' arrMonth contains last 24 months, e.g. "12_2009" to "1_2008"' 
' stored procedure can return values for any month between that range' 
' amount of returned values (DataSet sqlRows) can vary from 0 to 24' 
    If arrMonth(intCounter) = sqlRow("month") & "_" & sqlRow("year") Then 
    strLine_1 &= "<td>" & CInt(sqlRow("qty")) & "</td>" 
    arrSumma_1 = arrSumma_1 + CInt(sqlRow("qty")) 
    sqlRow.MoveNext 
    Else 
    strLine_1 &= "<td class='cell'>0</td>" 
    End If 
Else 
'using intCouter and same code to separate sales in 12 month periods' 
    If arrMonth(intCounter) = sqlRow("month") & "_" & sqlRow("year") Then 
    strLine_2 &= "<td>" & CInt(sqlRow("qty")) & "</td>" 
    arrSumma_2 = arrSumma_2 + CInt(sqlRow("qty")) 
    sqlRow.MoveNext 
    Else 
    strLine_2 &= "<td>0</td>" 
    End If 
End If 
intCounter = intCounter + 1 
Loop 

回答

2

我認爲你正在試圖在你的代碼中做這件事來關注錯誤的領域。我可以在那裏想到一個可能的解決方案,但它非常混亂。相反,請注意確保存儲過程返回的集合已完成,以便您可以迭代它們而不用擔心丟失的月份。也就是說,存儲過程可能只返回由銷售產生的月份(例如由於內部連接)而產生的集合 - 而且您需要更改此設置,以便返回所有月份。

因此,我不建議發佈VB代碼,而是建議您發佈存儲過程以獲得幫助解決問題。

作爲一般指導,我會與年內上市的幾個月創​​造一個虛擬表處理這個(與他們的月號一起執行連接)。然後,使用左外部聯接將該表與該查詢進行摺疊,以確保表示所有月份。此外,在選擇最終銷售數據時,通過使用「IsNull(Val,0)Val」替代零來確保沒有空值(對於沒有銷售的月份)。

再一次,這只是一般性的指導,我們需要看到真正的幫助。

+0

+1好的建議 – JonH 2009-12-18 13:56:20

+0

謝謝馬克快速回答!我會看看我的程序。這將是聯機查詢,所以我不能使用固定表。我可以創建臨時表,保存最後24個飛蛾,並在sql中使用COALESCE作爲空值。我現在不得不離開辦公室......週末愉快! – Sami 2009-12-18 14:26:42

0

以下是我如何用SQL解決這個問題。我創建了最近24個月的動態臨時表,以及0到24個月的銷售數據的另一個臨時表。也許這會幫助有類似問題的人。 (以下代碼在sql server中作爲存儲過程)。謝謝你的幫助Mark!

DECLARE @strTemp_months TABLE 
( 
    sorting INT, 
    months INT, 
    years INT 
) 

DECLARE @mnth INT 
SET @mnth = 0 

WHILE (@mnth < 24) 
    BEGIN 
     INSERT @strTemp_months 
     SELECT CASE WHEN YEAR(GETDATE()) = YEAR(DATEADD(m , [email protected] , GETDATE())) THEN 1 ELSE 2 END AS sorting, 
      MONTH(DATEADD(m , [email protected] , GETDATE())), YEAR(DATEADD(m , [email protected] , GETDATE())) 
     SET @mnth = @mnth + 1 
END 

DECLARE @productID VARCHAR(12) 
SET @productID = '1234567890' 

DECLARE @strTemp_statistics TABLE 
( 
    sorting INT, 
    months INT, 
    years INT, 
    productno VARCHAR(35), 
    salesqty DECIMAL(9,2) 
) 

INSERT @strTemp_statistics 
SELECT CASE WHEN YEAR(transaction_date) = YEAR(GETDATE()) THEN 1 ELSE 2 END AS sorting, 
     MONTH(transaction_date) AS months, YEAR(transaction_date) AS years, product_number AS productno, 
     SUM(qty) AS salesqty 
FROM sales_events 

WHERE product_number = @productID 
    -- including all transactions from last 24 full months until today 
    AND transaction_date >= CAST(YEAR(DATEADD(m , -23 , GETDATE())) AS CHAR(4)) + '-' + CAST(MONTH(DATEADD(m , -23 , GETDATE())) AS VARCHAR(2)) + '-01' 
GROUP BY MONTH(transaction_date), YEAR(transaction_date), product_number 

SELECT m.sorting, m.months, m.years, COALESCE(productno, 'No Sales') AS productno, COALESCE(kpl, 0) AS salesqty 
FROM @strTemp_months m LEFT OUTER JOIN @strTemp_statistics s 
    ON m.months = s.months AND m.years = s.years 
ORDER BY 1, 2 DESC