2012-02-27 3 views
1

Я выполнение этого заявления на платформе ASP.NET с SQL ServerSQL SUM() функция всегда возвращает 0

SELECT id, size, color, 
     SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN stock ELSE 0 END) 
     + SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN incoming ELSE 0 END) 
     - SUM(CASE WHEN storeID IN ('E13','E15','E10') THEN outgoing ELSE 0 END) 
    AS Total 
FROM stocks 
GROUP BY id, size, color 

И это код, я использую, чтобы получить полученные значения

For Each rowStock In TableStocks.Rows 
    Dim product As New ProductInfo 
    With product 
     .id = rowStock("id") 
     .size = rowStock("size") 
     .color = rowStock("color") 
     .stock = rowStock("Total") 
    End With 
Next 

id, size и color значения являются правильными, но результат функции SUM всегда равен 0. Если я выполнить запрос на управление SQL Server это работает отлично.

Я попытался изменить

.stock = rowStock(3) 

вместо

.stock = rowStock("Total") 

, но я получаю тот же результат. Я не могу понять, что мне не хватает.

+3

Что в 3 СУММ вернуться в индивидуальном порядке? – gbn

+0

Кажется, что случаи возвращают ноль в заданном условии или значения, проверяют сумму всех значений в формуле отдельно. – Myra

+0

@ gbn Первый SUM возвращает фактический запас для каждого продукта. Второй, возвращает количество единиц, заказанных производителю. Последний возвращает количество единиц, отправленных производителю из-за производственных дефектов. –

ответ

0

Наконец-то я нашел решение своего вопроса. Я сохранил свой запрос в хранимой процедуре в базе данных и работает так, как я ожидал.

EDIT

Я нашел другое решение без использования хранимых процедур. Я понял, что перед запуском оператора sql он преобразуется в нижний регистр. Поэтому я решил использовать COLLATE SQL_Latin1_General_CP1_CI_AS в поле storeID, просто чтобы попробовать. Это сработало!

Окончательный SQL запрос

SELECT id, size, color, 
    SUM(CASE WHEN storeID COLLATE SQL_Latin1_General_CP1_CI_AS 
    IN ('E13','E15','E10') THEN stock + incoming - outgoing ELSE 0 END) 
    AS Total 
FROM stocks 
GROUP BY id, size, color 
0

Единственное, что я вижу, это лишняя запятая после «общего», что указывает на другое имя столбца ожидается в запросе перед «из» ключевых слов и удушье ...

Кроме того, я бы изменить ваш запрос к ...

SELECT 
     id, size, color, sum(stock + incoming - outgoing) as Total 
    FROM 
    stocks 
    where 
     storeID IN ('E13','E15','E10') 
    GROUP BY 
     id, size, color 
+1

Ваш альтернативный запрос возвращает значительно разные результаты. Исходный запрос возвращает строки, даже если storeID не входит в список IN. * Если * вы хотите упростить запрос Total, может быть компьютер, например. с 'SUM (CASE WHEN storeID IN ('E13', 'E15', 'E10') THEN + входящий - исходящий ELSE 0 END)' –

+1

@AndreLoker, вы правы. однако, похоже, они искали инвентарь для нескольких конкретных магазинов. Если бы у меня был бизнес с большим инвентарем (скажем, 1000 пунктов), а места, в которых меня беспокоило, было только 200, я бы не хотел, чтобы список наворотов я бы никогда не посмотрел. – DRapp

+0

, не зная точных требований, трудно сказать, куда идти. По крайней мере, мы показали несколько способов упрощения запроса, чтобы исходный автор мог выбрать то, что ему подходит. Тем не менее это не решает его оригинальную проблему. –

Смежные вопросы