2015-12-19 5 views
0

Я пытаюсь получить сумму для всех ключей. За все годы (раздельно) в каждом году более одного раза, и takeng информация из трех DB Я могу сделать это в течение одного года, но как это сделать от всех. Там Ара фактически два года 1996 и 1997Группа с дополнительными функциями MySQL

Это, как получить все, что за 1996 год и почти такой же, как получить за 1997 Но как присоединиться к ним Орр некорректной everithing

SELECT OrderID, CustomerID, OrderDate, sum(Cost) as TotalCost 
FROM (SELECT Orders.CustomerID, Orders.OrderID, Orders.OrderDate, Orders.OrderID, OrderDetails.ProductID, (OrderDetails.Quantity* Products.Price) as Cost 
      FROM Orders, OrderDetails, Products 
      WHERE Orders.OrderID = OrderDetails.OrderID 
      AND OrderDetails.ProductID= Products.ProductID) 
WHERE OrderDate<="1996-12-31" 
Group by CustomerID 

здесь таблицы, что у меня есть Заказы

+---------+------------+------------+------------+-----------+ 
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID | 
+---------+------------+------------+------------+-----------+ 
| 10248 |   90 |   5 | 1996-07-04 |   3 | 
| 10249 |   81 |   6 | 1996-07-05 |   1 | 
| 10250 |   34 |   4 | 1996-07-08 |   2 | 
| 10251 |   84 |   3 | 1997-07-08 |   1 | 
| 10252 |   76 |   4 | 1997-07-09 |   2 | 
+---------+------------+------------+------------+-----------+ 

Детали_Заказов

+---------------+---------+-----------+----------+ 
| OrderDetailID | OrderID | ProductID | Quantity | 
+---------------+---------+-----------+----------+ 
|    1 | 10248 |  1 |  12 | 
|    2 | 10248 |  2 |  10 | 
|    3 | 10248 |  3 |  5 | 
|    4 | 10249 |  1 |  9 | 
|    5 | 10249 |  2 |  40 | 
|    6 | 10250 |  1 |  10 | 
|    7 | 10250 |  2 |  35 | 
|    8 | 10250 |  3 |  15 | 
+---------------+---------+-----------+----------+ 

и продукты

+-----------+--+------------+------------+--+-------+ 
| ProductID | | SupplierID | CategoryID | | Price | 
+-----------+--+------------+------------+--+-------+ 
|   1 | |   1 |   1 | | 18 | 
|   2 | |   1 |   1 | | 19 | 
|   3 | |   1 |   2 | | 10 | 
+-----------+--+------------+------------+--+-------+ 

Я использую MySQL Извините за длинный пост

P.S. он сказал

нет такой функции: год

P.P.S. Я имел обыкновение использовать SQLlite

+0

он сказал, что нет года функция, может быть тип OrderDate колонные не является неправильным –

+0

«Нет такой функции : year "- этот формат сообщения об ошибке типичен для sqlite, а не для mysql. Вы уверены, что используете mysql, а не sqlite? – Shadow

ответ

1

Используйте года() MySQL чтобы извлечь часть года с даты:

select o.customerid, year(o.orderdate) as year, sum(od.Quantity* p.Price) as totalcost 
from orders o 
inner join orderdetails od on o.orderid=od.orderid 
inner join products p on od.productid=p.productid 
group by o.customerid, year(o.orderdate) 

Обновление:

На основании сообщения об ошибке вы можете использовать sqlite, а не mysql. В этом случае используйте подстрока(), чтобы получить 4 крайние левые символы, в противном случае логика та же:

select o.customerid, substr(o.orderdate,1,4) as year, sum(od.Quantity* p.Price) as totalcost 
from orders o 
inner join orderdetails od on o.orderid=od.orderid 
inner join products p on od.productid=p.productid 
group by o.customerid, substr(o.orderdate,1,4) 
2

Вы бы включать year(OrderDate) в агрегации:

SELECT OrderID, CustomerID, year(OrderDate), sum(Cost) as TotalCost 
FROM (SELECT Orders.CustomerID, Orders.OrderID, Orders.OrderDate, Orders.OrderID, OrderDetails.ProductID, (OrderDetails.Quantity* Products.Price) as Cost 
     FROM Orders JOIN 
      OrderDetails 
      ON Orders.OrderID = OrderDetails.OrderID JOIN 
      Products 
      ON OrderDetails.ProductID = Products.ProductID 
    ) x 
WHERE OrderDate <= '1996-12-31' 
Group by CustomerID, year(OrderDate); 

На самом деле, подзапрос является ненужным, и вы должны использовать псевдонимы таблиц:

SELECT o.CustomerID, year(o.OrderDate), SUM(od.Quantity * p.Price) as Cost 
FROM Orders o JOIN 
    OrderDetails od 
    ON o.OrderID = od.OrderID JOIN 
    Products p 
    ON od.ProductID = p.ProductID 
GROUP BY CustomerId, year(OrderDate) 
+0

1. Вы должны принять заказ из внешнего выбора. 2. Зачем вам нужен подзапрос? – Shadow

+0

И теперь вы отправили точно такое же решение, как и у меня :) – Shadow

+0

, но он говорит, что функции года нет. Функция 0 (0) –

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