Count i sum - jak wykorzystać

0

Mam dane w tabeli orders(odnośnie zamówienia) i orders_positions(odnośnie pozycji w zamówieniu).

Potrzebuję utworzyć csv zawierający: nazwa firmy(tabela orders)- ilość zamówień(suma wystąpień pola company w tabeli orders) - kwota zamówień (suma z tabeli orders_positions w relacji orders.id = order_positions.orderId).

W jaki sposób wykorzystać funkcje count i sum?
Do tej pory tworzyłem csv z danymi w ten sposób (nie sumuje to danych tylko je wyświetla) :

SELECT o.*,, SUM(amount*price) AS `price`
		FROM ".dbPrefix."orders o JOIN ".dbPrefix."order_positions p ON p.orderId = o.id GROUP BY orderId ORDER BY date DESC

Jakby trzeba było to struktura tabeli orders:

CREATE TABLE `orders` (
  `id` int(11) NOT NULL,
  `date` int(11) NOT NULL DEFAULT '0',
  `ip` varchar(30) NOT NULL DEFAULT '0.0.0.0',
  `clientId` bigint(20) DEFAULT NULL,
  `clientSymbol` varchar(100) NOT NULL DEFAULT '',
  `name` varchar(50) DEFAULT NULL,
  `company` varchar(100) DEFAULT NULL,
  `companyFull` varchar(500) DEFAULT '',
  `street` varchar(50) NOT NULL,
  `zipCode` varchar(10) NOT NULL,
  `town` varchar(50) NOT NULL,
  `country` varchar(100) NOT NULL DEFAULT 'Polska',
  `phone` varchar(15) NOT NULL,
  `email` varchar(100) NOT NULL,
  `nip` varchar(15) DEFAULT NULL,
  `notes` text,
  `clientNotes` text,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `payment` varchar(100) NOT NULL,
  `lang` char(2) NOT NULL DEFAULT 'pl',
  `paid` tinyint(1) NOT NULL DEFAULT '0',
  `history` text,
  `session_id` varchar(100) NOT NULL,
  `customOrderNumber` varchar(100) NOT NULL DEFAULT '',
  `sin` varchar(200) DEFAULT '',
  `ad_list` varchar(200) NOT NULL DEFAULT '',
  `ad_name` varchar(50) DEFAULT '',
  `ad_company` varchar(100) DEFAULT '',
  `ad_street` varchar(50) DEFAULT '',
  `ad_zipCode` varchar(10) DEFAULT '',
  `ad_town` varchar(50) DEFAULT '',
  `ad_country` varchar(200) DEFAULT '',
  `ad_phone` varchar(15) DEFAULT '',
  `ad_email` varchar(100) NOT NULL DEFAULT '',
  `dotpay_t_id` varchar(200) DEFAULT NULL,
  `dotpay_t_date` varchar(200) DEFAULT NULL,
  `pwr_destination_code` varchar(200) DEFAULT NULL,
  `pwr_destination_address` text,
  `pwr_ean` varchar(200) DEFAULT NULL,
  `currency` varchar(10) NOT NULL DEFAULT 'PLN',
  `paczkomat` varchar(200) NOT NULL DEFAULT '',
  `invoice` varchar(100) NOT NULL DEFAULT '',
  `zk_subiekt` varchar(100) NOT NULL DEFAULT '0',
  `delivery_method` varchar(100) NOT NULL DEFAULT 'kurier',
  `paczkomat_labelId` varchar(100) NOT NULL DEFAULT '',
  `paczkomat_zlecenieId` varchar(100) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Orders positions:

CREATE TABLE `order_positions` (
  `id` int(11) NOT NULL,
  `orderId` int(11) NOT NULL,
  `name` varchar(500) NOT NULL,
  `productId` int(11) DEFAULT NULL,
  `amount` int(11) NOT NULL,
  `unit` varchar(20) NOT NULL DEFAULT 'szt.',
  `price` decimal(10,2) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `currency` varchar(10) NOT NULL DEFAULT 'PLN',
  `symbol` varchar(100) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3
SELECT o.Name 
,COUNT(o.company) IloscZamowien
,SUM(amount) WartoscZamowien

FROM Orders o
JOIN order_positions p
ON o.id = p.orderId

GROUP BY o.Name
0

Dzięki za odpowiedź @BlackBad jedyny mankament jest taki, że to(IloscZamowien) zlicza ilość wystąpień w tabeli orders_positions czyli ilość pozycji do zamówień a nie ilość złożonych zamówień.

1

Zlicz zatem numery zamówień, a dla pewności użyj do tego DISTINCT:

SELECT o.Name 
,COUNT(DISTINCT o.id) IloscZamowien
,SUM(amount) WartoscZamowien

FROM Orders o
JOIN order_positions p
ON o.id = p.orderId

GROUP BY o.Name

1 użytkowników online, w tym zalogowanych: 0, gości: 1