Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

select с разными условиями

Практика




(
SELECT
SUM(`itogo`) AS rr, `Id_klient`, klient.name
FROM
`bill_n`, klient
WHERE
(klient.id = bill_n.Id_klient) AND (bill_n.`vid` = 0) AND (bill_n.`status` = 1)

)
UNION
(
SELECT
SUM(`itogo`) AS rr1, `Id_klient`, klient.name
FROM
`bill_n`, klient
WHERE
(klient.id = bill_n.Id_klient) AND (bill_n.`vid` = 1) AND (bill_n.`status` = 1)

)

как сделать чтобы был четвертый столбец rr1
Вопрос не очень понятен.
Думаю, что имелось в виду это:
(select sum(`itogo`) AS rr, `Id_klient`, klient.name, null as rr1 from … )
union
(select null as rr, `Id_klient`, klient.name, SUM(`itogo`) AS rr1 from …)
То бишь в обе части добавить этот столбец, но в зависимости от ситуации подставлять туда сразу null
да именно это имею ввиду, спасибо, но как теперь сгруппировать по группам GROUP BY `Id_klient`?
делаю

(
SELECT
SUM(`itogo`) AS rr, `Id_klient`, klient.name, null as rr1
FROM
`bill_n`, klient
WHERE
(klient.id = bill_n.Id_klient) AND (bill_n.`vid` = 1) AND (bill_n.`status` = 1)
GROUP BY
`Id_klient`
)
UNION ALL
(
SELECT
null as rr, `Id_klient`, klient.name, SUM(`itogo`) AS rr1
FROM
`bill_n`, klient
WHERE
(klient.id = bill_n.Id_klient) AND (bill_n.`vid` = 0) AND (bill_n.`status` = 1)
GROUP BY
`Id_klient`
)
а результат

=============================================================================================================================================================================================================
| rr | Id_klient | name | rr1 |
=============================================================================================================================================================================================================
| 0,07 | 15 | Новый клиент 15------ | null |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| null | 15 | Новый клиент 15------ | 200,04 |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| null | 17 | Новый 17клиент | 9,12 |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Как связанны таблицы orders и klient? Для каждой записи из klient существует одна запись в orders? Для каждой записи из klient существует не более одной записи в orders? Для каждой записи из klient может существовать произвольное число записей в orders?
Для каждой записи из klient может существовать произвольное число записей в orders но в orders есть поле id.klient и в klient есть поле id и они логически как бы связаны
Тогда какое поле orders.summa Вы хотите выбрать если, для Id_klient может существовать несколько строк с потенциально различным значением поля orders.summa?


select
sum(if(bill_n.`vid` = 1,`itogo`,0)) as rr,
sum(if(bill_n.`vid` = 0,`itogo`,0)) as rr1,
`Id_klient`,
klient.name
from
`bill_n` join
klient on klient.id = bill_n.Id_klient
where
bill_n.`status` = 1
group by
`Id_klient`
Да, теперь разобралась ,всем огромное спасибо!!!!!!!!!!!!!

SELECT bill_n.`Id_klient`, klient.name,
SUM(IF(bill_n.`vid` = 0, `itogo`, 0)) AS rashod,
SUM(IF(bill_n.`vid` = 1, `itogo`, 0)) AS prihod,
SUM(IF(orders.Schet = 0, orders.summa, 0)) AS za_RN,
SUM(IF(orders.Schet = 1, orders.summa, 0)) AS za_PR
FROM
`bill_n`
JOIN
klient ON klient.id = bill_n.Id_klient
JOIN
orders ON orders.Id_klient = klient.id
WHERE
bill_n.`status` = 1
GROUP BY
`Id_klient`


Но теперь проблема в другом [size=18]лишний раз считает join mysql[/size]

SELECT
bill_n.`Id_klient`, klient.name, ROUND(SUM(IF(bill_n.`vid` = 0, bill_n.`itogo`, 0)), 2) AS rashod,
ROUND(SUM(IF(orders.Schet = 0, orders.summa, 0)), 2) AS za_RN
FROM
`bill_n`
JOIN klient ON klient.id = bill_n.Id_klient
JOIN orders ON orders.Id_klient = klient.id
WHERE
bill_n.`status` = 1
GROUP BY
bill_n.`Id_klient`;

дает результат
=============================================
|Id_klient | name | rashod | za_RN |
=============================================
| 15 | Новый | 200,04 | 0,0 |
| | клиент | | |
| | 15------ | | |
---------------------------------------------
| 17 | Новый | 72,96 | 20,12 |
| | 17клиент | | |
---------------------------------------------


а на самом деле


=============================================
|Id_klient | name | rashod | za_RN |
=============================================
| 15 | Новый | 200,04 | 0,0 |
| | клиент | | |
| | 15------ | | |
---------------------------------------------
| 17 | Новый | 9,12 | 20,12 |
| | 17клиент | | |
---------------------------------------------


видимо из-за вложенности лишний раз пересчитывает, как сделать правильно?????? и возможно ли это?



действительно в orders есть 8 записей с orders.Id_klient = klient.id=17
select
klient.id,
klient.name,
bill_n_group.rashod,
orders_group.za_RN
from
klient left join
(
select
Id_klient,
ROUND(SUM(IF(`vid` = 0, `itogo`, 0)), 2) AS rashod
from
bill_n
group by
Id_klient
) as bill_n_group on klient.id=bill_n_group.Id_klient left join
(
select
Id_klient,
ROUND(SUM(IF(Schet = 0, summa, 0)), 2) AS za_RN
from
orders
group by
Id_klient
) as orders_group on klient.id=orders_group.Id_klient
создано: 2011-09-14
обновлено: 2021-03-13
132512



Рейтиг 10 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

MySql (Maria DB)

Термины: MySql (Maria DB)