SQL для сопоставления с таблицами

У меня есть два результата запроса один:

amount | percent
100    | 10
200    | 20
300    | 30
400    | 40

и второе это:

sales
10
20
110
120
210
220
310
320

Есть ли способ получить что-то вроде этого:

sales                      | percent
30 (this is sum below 100) | 10
230(this is sum between 100 and 200) | 20
430(this is sum between 200 and 300) | 30
630(this is sum between 300 and 400) | 40

я думал сделать это с PHP массивами и циклами, но я предпочитаю не отправлять много запросов на сервер. какие-либо предложения?

1

Решение

подзапрос будет выполнять запрос много раз, и это не хорошо
это будет лучше сделать с php
вот так (вместо запросов у меня есть массив $ first и $ second)

$first = array(
array(
'amount' => 100,
'percent' => 10
),
array(
'amount' => 200,
'percent' => 20
),
array(
'amount' => 300,
'percent' => 30
),
array(
'amount' => 400,
'percent' => 40
)
);
$second = array(
array(
'sales' => 10
),
array(
'sales' => 20
),
array(
'sales' => 110
),
array(
'sales' => 120
),
array(
'sales' => 210
),
array(
'sales' => 220
),
array(
'sales' => 310
),
array(
'sales' => 320
)
);

$result = array();
$second_len = count($second);
$s=0;
for ($i=0,$len=count($first); $i < $len; $i++) {
$sum = 0;
for (;$s < $second_len; $s++) {
if ($second[$s]['sales'] <= $first[$i]['amount']) {
$sum += $second[$s]['sales'];
} else {
break;
}
}
$result[] = array(
'sales' => $sum,
'percent' => $first[$i]['percent']
);
}

var_dump($result);
1

Другие решения

Вы говорите, что у вас есть два «результата запроса». Я предполагаю, что они приходят из таблиц. Итак, при условии, что у вас есть следующие две таблицы:

thresholds
----------
amount | percent
100    | 10
200    | 20
300    | 30
400    | 40

sales
-----
amount
10
20
110
120
210
220
310
320

Вы можете получить свои результаты с помощью этого запроса:

SELECT
SUM(sales_amount) sales
,threshold_percent percent
FROM (
SELECT
s.amount sales_amount
,t.amount threshold_amount
,t.percent threshold_percent
FROM sales s
INNER JOIN thresholds t
ON t.amount > s.amount
LEFT JOIN thresholds t2
ON t2.amount < t.amount
AND t2.amount > s.amount
WHERE t2.amount IS NULL
) sales_percents
GROUP BY threshold_amount

Вы можете проверить запрос здесь: SQLFiddle

Это должно выполняться достаточно быстро, пока у вас есть индексы на thresholds.amount а также sales.amount,

1

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

select percent, sum(sales)
from (select q2.*,
(select q1.percent
from query1 q1
where q1.amount >= q2.sales
order by q1.amount desc
limit 1
) as percent
from query2 q2
) q
group by percent;
1
По вопросам рекламы [email protected]