2012-02-11 3 views
1

Мне нужна помощь в разработке запроса. У меня есть одна таблица с большим количеством строк (она должна быть в одной таблице).Sql объединяется только из одной таблицы

Table name: 201201 
columns = code, batch, value, volume 
rows = 301, 2920, 100, 2000 
      301, 3192, 40, 800 
      302, 6479, 230, 3100 
      303, 4930, 20, 50 
      303, 3920, 60, 95 

Как я мог вытащить результаты так оно представлено таким образом:

code, batches, value, volume 
301, 2,  140, 2800 
302, 1,  230, 3100 
303, 2,  80, 145 

Я сделал это, когда я использую multiplie таблицы, но не может заставить его работать, когда все строки находятся в такой же таблица.

мне удалось получить счетчик партии и mrdr с этим запросом

SELECT DISTINCT(`201201`.code), count(DISTINCT(z.batch)) as batches 
FROM `201201` 
LEFT JOIN `201201` AS z ON `201201`.code = z.code 
GROUP BY `201201`.code 

Но я застрял. Спасибо заранее.

новый выпуск! Итак, в той же таблице у меня есть столбец риска, который содержит число с плавающей запятой для каждой партии:

Table name: 201201 
columns = code, batch, value, volume, risk 
rows = 301, 2920, 100, 2000, 0.3 
      301, 3192, 40, 800, 0.2 
      302, 6479, 230, 3100, 0.8 
      303, 4930, 20, 50,  0.8 
      303, 3920, 60, 95,  1 

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

code, batches, value, volume, risk 
301, 2,  140, 2800, 38 

Откуда 38, 0.3 * 100 + 0.2 * 40. То же самое для кода 302 и 303.

+0

Вы должны переименовать таблицу, а также. '201201' является полностью двусмысленным. Скорее дайте таблице подходящее имя и добавьте поле даты в таблицу, чем указав в таблице число «YYYYMM» – Richard

+0

Hm, может ли это/вызвать какие-либо проблемы? Дело в том, что таблицы создаются путем импорта файлов excel в месяц, и эти файлы не содержат поля даты. Таким образом, один файл = одна таблица. – Josef

+0

Нет никаких проблем. Вы можете добавить дату вручную в свой SQL или сделать поле «timestamp», и вам не нужно ничего делать, он автоматически добавит метку времени при добавлении строки. – Richard

ответ

1

Зачем вам нужно присоединиться, когда вы можете сделать это без участия? Надеюсь, что это помогает:

SELECT `code`, 
     COUNT(`Batch`) as Batches, 
     SUM(`Value`) as TotalValue, 
     SUM(`Volume`) as TotalVolume, 
     SUM(`Value` * `Risk`) as TotalRisk -- I'm not sure if this works 
FROM `201201` 
GROUP BY `code` 

если выше не работает, попробуйте автообъединение:

SELECT a.`code`, 
     COUNT(a.`Batch`) as Batches, 
     SUM(a.`Value`) as TotalValue, 
     SUM(a.`Volume`) as TotalVolume, 
     SUM(b.`SubRisk`) as TotalRisk 
FROM `201201` a INNER JOIN 
      (
       SELECT c.`code`, (c.`Value` * c.`Risk`) as SubRisk 
       FROM `201201` c 
      ) b ON a.`Code` = b.`Code` 
GROUP BY `code` 
+0

Ничего себе, было так просто! Благодарю. – Josef

+0

@Josef Великий, я помог вам! Добро пожаловать. –

+0

Что делать, если у меня есть столбец (с именем risk), который содержит номер поплавка для каждой партии, и я хотел бы сделать значение риска * для каждой строки и суммировать результаты для каждого кода? Таким образом, мы имеем общую стоимость и значение риска. – Josef

0

это выглядит как будто вы суммированием другие значения ..?

SELECT code, count(batch) as batches, sum(value) as values, sum(volume) as volumes 
FROM `201201` 
GROUP BY `201201`.code 
+0

Я считаю, что это ошибка в 'count (z.batch)'. –

+0

вы правы - отредактирован :) – Randy

+0

Рэнди, вы знаете, как будет выглядеть запрос, если бы я хотел бы суммировать только тома, которые поступают из отдельных партий и кодов? Запрос, который у меня есть, теперь отлично работает, но только если у меня есть уникальные номера ... например, если у меня есть код 303 и пакет 1 и партия 1, тома 20 и том 30, я хотел бы просто «суммировать» объем 30 и игнорировать 20. Теперь я получаю 50. – Josef

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