2009-12-18 3 views
0

신입 회원을 도와주세요. 저장 프로 시저에서 지난 2 년간의 세일즈 통계를 읽고, asp.net 사이트에 표시하면 정상적으로 작동합니다.
자주 팔리지 않는 제품에 문제가 있습니다. 어떤 달에 판매가 없는지 파악해야합니다. 이 경우 테이블 셀에 0을 넣고 데이터 집합의 다음 행으로 이동해야합니다.
각 달에 대한 데이터가없는 경우 각각은 속임수를 쓰지 않습니다.
질문 : 다음 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

코드에서이 작업을 시도하여 잘못된 영역에 초점을 맞추고 있다고 생각합니다. 나는 거기에서 가능한 해결책을 생각할 수있다. 그러나 그것은 정말로 혼란 스럽다. 대신, 저장된 proc에 의해 리턴 된 세트가 완전하도록하여 누락 된 월에 대한 걱정없이 반복 할 수 있도록하는 데 중점을 둡니다. 즉, 스토어드 프로시 저는 아마도 판매가 발생한 곳 (예 : 내부 조인)으로 만 이루어진 세트를 반환하는 것이므로 모든 월을 반환하도록이 설정을 변경해야합니다.

그래서 VB 코드를 게시하는 대신 저장된 proc을 게시하여 문제를 해결하는 데 도움을 받으시기 바랍니다.

일반적인 가이드 라인으로, 조인을 수행하기위한 달 번호와 함께 나열된 연도의 달이 포함 된 더미 테이블을 생성하여이 접근 방식을 취할 것입니다. 그런 다음 왼쪽 외부 조인을 사용하여 쿼리를 사용하여 해당 테이블을 접어 모든 달이 표시되도록합니다. 또한 최종 판매 수치를 선택할 때 "IsNull (Val, 0) as Val"을 0으로 대체하여 null 값이 없는지 확인하십시오 (판매가 없었던 달 동안).

다시 말하지만, 이것은 일반적인 지침 일 뿐이므로 실제로 도움이되는 실제 sproc을 확인해야합니다.

+0

+1 좋은 조언을 위해 – JonH

+0

감사합니다. 나는 나의 절차를 볼 것이다. 이것은 온라인 쿼리가 될 것이므로 고정 테이블을 사용할 수 없습니다. 마지막으로 24 개가있는 임시 테이블을 만들고 SQL의 null 값에 COALESCE를 사용할 수 있습니다. 나는 지금 당장 퇴근해야한다. 좋은 주말 보내라! – Sami

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