请帮助新手。 我正在从存储过程中读取过去两年的销售统计数据,在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
答案 0 :(得分:2)
我认为您通过尝试在代码中执行此操作来专注于错误的区域。我可以想到一个可能的解决方案,但它真的很混乱。相反,要专注于确保存储过程返回的集合是完整的,这样您就可以迭代它们而不用担心丢失数月。也就是说,存储过程可能只返回由销售(例如由于内部联接)的月份组成的集合 - 并且您需要更改它以使其返回所有月份。
因此,我建议您发布存储过程以获得解决问题的帮助,而不是发布VB代码。
作为通用指南,我将通过创建一个包含列出的年份月份的虚拟表(以及执行连接的月份数字)来实现此目的。然后,使用左外连接将该表折叠到查询中,以确保表示所有月份。此外,在选择最终销售数据时,通过使用“IsNull(Val,0)as Val”来替换零,确保没有空值(对于没有销售的月份)。
同样,这只是一般指导,我们需要看到实际的sproc真正有用。
答案 1 :(得分:0)
以下是我用SQL解决这个问题的方法。我创建了持有最近24个月的动态临时表和另一个临时表,销售数据为0到24个月。也许这会帮助有类似问题的人。 (下面的代码在sql server中作为存储过程)。谢谢你的帮助马克!
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 , -@mnth , GETDATE())) THEN 1 ELSE 2 END AS sorting,
MONTH(DATEADD( m , -@mnth , GETDATE())), YEAR(DATEADD( m , -@mnth , 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