2009-08-27 6 views
0

У меня есть этот запрос, чтобы получить общий OrderStatus, который имеет значения 1 и 5. Как суммировать только отчетливый OD.OrderStatus = 2, поскольку в таблице Orderdetails с OrderStatus может быть несколько записей как 2.Проблема с выдающейся записью в запросе MS SQL Server 2008

Пожалуйста, помогите

SELECT O.OrderDate, 
Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End) AS OrdersOffered, 
Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O,OrderDetails OD 
Where O.Order_ID=OD.Order_ID 
GROUP BY OrderDate 
+0

Просьба представить некоторые примеры данных и результаты, которые вы ищете. Пока что описание, которое вы даете, кажется либо неполным, либо противоречивым, и мы не можем понять, что вы на самом деле пытаетесь сделать. – RBarryYoung

ответ

1

Итак, вы хотите быть 1, независимо от того, сколько у вас есть? Может быть, использовать SIGN?

SELECT O.OrderDate 
    ,SIGN(Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End)) AS OrdersOffered 
    ,Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O 
    JOIN OrderDetails OD ON O.Order_ID=OD.Order_ID 
GROUP BY OrderDate 
+0

Спасибо. Я думаю, мне нужен SUM (Sign (Case When OD.OrderStatus = 2 Then 1 Else 0 End)) AS OrdersOffered Мне нужно попробовать завтра. Я не знаю, будет ли это работать – acadia

+0

Нет. Предположим, у вас есть десять OrderStatus = 2 записи. SUM (SIGN (добавит много 1s, чтобы получить 10. Вы хотите преобразовать 10 (Sum) обратно в 1. Так что это SIGN (SUM (, а не SUM (SIGN (. –

+0

) Спасибо, Роб. Вот моя забота. query У меня есть диапазон дат в where, где он возвращается для каждой даты в диапазоне, на котором будет отображаться orderdate, orderoffered, ordersaccepted. Но OrderID 10010 может иметь 10 заказов со статусом 2, но он должен учитывать только 1, но для того же date Сумма для OrderIDs 10010, 10011,10012,10013 должна быть 3, а не 1. Спасибо – acadia

0

Просто используйте подзапрос, чтобы помочь с вашим результатом.

SELECT 
O.OrderDate, 
Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End) AS OrdersOffered, 
Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O inner join 
    (Select distinct Order_ID,OrderStatus 
    from OrderDetails) OD on O.Order_ID=OD.Order_ID 
GROUP BY OrderDate 

Если сделать трюк ...

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