MySQL присоединиться - PullRequest
       5

MySQL присоединиться

0 голосов
/ 08 марта 2012

У меня есть таблица с именем получение с 4 столбцами:

id, date, volume, volume_units

Единицы объема всегда хранятся в виде значений «фунтов» или «Галс».

Я пытаюсьнаписать запрос SQL, чтобы получить сумму томов в фунтах и ​​галлах для определенного диапазона дат.Что-то вроде: (что не работает)

SELECT sum(p1.volume) as lbs, 
p1.volume_units, 
sum(p2.volume) as gals, 
p2.volume_units 
FROM receiving as p1, receiving as p2
where p1.volume_units = 'Lbs'
and p2.volume_units = 'Gals' 
and p1.date between "2012-01-01" and "2012-03-07" 
and p2.date between "2012-01-01" and "2012-03-07" 

Когда я запускаю эти запросы отдельно, результаты оказываются далеко не такими.Я знаю, что соединение неверно, но я не знаю, что я делаю неправильно, чтобы исправить это.

Ответы [ 5 ]

5 голосов
/ 08 марта 2012
  SELECT SUM(volume) AS total_sum,
         volume_units
    FROM receiving
   WHERE `date` BETWEEN '2012-01-01'
                    AND '2012-03-07'
GROUP BY volume_units
1 голос
/ 08 марта 2012

Этот запрос будет отображать итоговые значения для каждого ID.

SELECT  s.`id`, 
        CONCAT(s.TotalLbsVolume, ' ', 'lbs') as TotalLBS,
        CONCAT(s.TotalGalVolume, ' ', 'gals') as TotalGAL
FROM
    (
        SELECT  `id`, SUM(`volume`) as TotalLbsVolume
        FROM    Receiving a INNER JOIN
                    (
                        SELECT  `id`, SUM(`volume`) as TotalGalVolume
                        FROM    Receiving
                        WHERE   (volume_units = 'Gals') AND
                                (`date` between '2012-01-01' and '2012-03-07')
                        GROUP BY `id`
                    ) b ON a.`id` = b.`id`
        WHERE   (volume_units = 'Lbs') AND
                (`date` between '2012-01-01' and '2012-03-07')
        GROUP BY `id`
    ) s
1 голос
/ 08 марта 2012

Вы можете достичь этого в одном запросе, используя IF(condition,then,else) в пределах SUM:

SELECT SUM(IF(volume_units="Lbs",volume,0)) as lbs,
       SUM(IF(volume_units="Gals",volume,0)) as gals,
FROM receiving
WHERE `date` between "2012-01-01" and "2012-03-07" 

Это только добавляет volume, если оно имеет правильную единицу.

0 голосов
/ 08 марта 2012

Вы можете просто группировать по дате и volume_units без самостоятельного объединения.

SELECT date, volume_units, sum(volume) sum_vol
FROM receving
WHERE date between "2012-01-01" and "2012-03-07"
GROUP BY date, volume_units

Образец теста:

select d, vol_units, sum(vol) sum_vol 
from
(
select 1 id, '2012-03-07' d, 1 vol, 'lbs' vol_units
union
select 2 id, '2012-03-07' d, 2 vol, 'Gals' vol_units
union
select 3 id, '2012-03-08' d, 1 vol, 'lbs' vol_units
union
select 4 id, '2012-03-08' d, 2 vol, 'Gals' vol_units
union
select 5 id, '2012-03-07' d, 10 vol, 'lbs' vol_units
) t
group by d, vol_units
0 голосов
/ 08 марта 2012

это перекрестное объединение без видимых условий объединения, я не думаю, что вы имели в виду

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...