набор данных и несуществующие строки - PullRequest
0 голосов
/ 18 декабря 2009

Пожалуйста, помогите новичку. Я читаю статистику продаж за последние два года из хранимой процедуры, отображаю ее на сайте 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 ]

2 голосов
/ 18 декабря 2009

Я думаю, что вы сосредотачиваетесь не на той области, пытаясь сделать это в своем коде. Я могу подумать о возможном решении, но оно действительно грязное. Вместо этого сосредоточьтесь на том, чтобы убедиться, что наборы, возвращаемые хранимым процессом, завершены, чтобы вы могли выполнять их итерацию, не беспокоясь о пропущенных месяцах. То есть хранимая процедура, вероятно, возвращает наборы, составленные только из месяцев, в которых были продажи (например, из-за внутреннего объединения) - и вам нужно изменить это, чтобы она возвращала все месяцы.

Итак, вместо публикации кода VB, я бы посоветовал вам опубликовать хранимый процесс, чтобы получить помощь в решении проблемы.

В качестве общего правила я бы подошел к этому, создав фиктивную таблицу с указанными месяцами года (вместе с их номерами месяцев для выполнения объединения). Затем сложите эту таблицу с запросом, используя левое внешнее соединение, чтобы обеспечить представление всех месяцев. Кроме того, при выборе окончательных показателей продаж убедитесь, что нет нулевых значений (для месяцев, в которых не было продаж), используя «IsNull (Val, 0) as Val» для замены нуля.

Опять же, это всего лишь общее руководство, нам нужно было бы увидеть фактическое происхождение, чтобы действительно помочь.

0 голосов
/ 30 декабря 2009

Вот как я решил это с помощью SQL. Я создаю динамическую временную таблицу, которая содержит последние 24 месяца, и другую временную таблицу с данными о продажах от 0 до 24 месяцев. Может быть, это поможет кому-то с подобной проблемой. (приведенный ниже код находится на сервере SQL как хранимая процедура). Спасибо за помощь, Марк!

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...