Reputation: 425
I have 2 tables ticket
and article
, I have this query :
SELECT hour(ticket.stats_iso) hour_num,
IF(MINUTE(ticket.stats_iso) < 30, 0, 1) interval_num,
min(ticket.stats_iso) interval_begin,
max(ticket.stats_iso) interval_end,
count(ticket.id) countid,
sum(ticket.montantTTC) sum_subtotal,
(sum(ticket.montantTTC)/count(ticket.id)) as moy
FROM ticket
WHERE ticket.annule = 0
AND ticket.stats_iso
BETWEEN '2012-01-01 00:00:00' AND '2012-01-01 23:59:59'
GROUP BY hour_num, interval_num
ORDER BY hour_num, interval_num
I have statistics about number of ticket
s and the sum of montantTTC
.
I would like to have the number of article
s then I joined :
SELECT hour(ticket.stats_iso) hour_num,
IF(MINUTE(ticket.stats_iso) < 30, 0, 1) interval_num,
min(ticket.stats_iso) interval_begin,
max(ticket.stats_iso) interval_end,
count(DISTINCT ticket.id) countid,
sum(ticket.montantTTC) sum_subtotal,
(sum(ticket.montantTTC)/count(ticket.id)) as moy, count(article.id)
FROM ticket, article
WHERE ticket.annule = 0
AND ticket.stats_iso
BETWEEN '2012-01-01 00:00:00' AND '2012-01-01 23:59:59'
AND ticket.uid = article.uid_ticket
GROUP BY hour_num, interval_num
ORDER BY hour_num, interval_num
It works BUT sum(ticket.montantTTC) sum_subtotal
becomes false... (indeed, with the join it sums many duplicate ticket
because of 1 ticket
has many article
s
count(ticket.id) countid
has a problem too but I can write count(DISTINCT ticket.id) countid
.
Does it exist a way to make a condition on sum(ticket.montantTTC) sum_subtotal
?
Example (of course, doesn't work) : sum(if ticket.id IS DISTINCT then ticket.montantTTC) sum_subtotal
Thank you very much.
Upvotes: 0
Views: 54
Reputation: 13110
SELECT HOUR(t.stats_iso) hour_num,
ROUND(MINUTE(t.stats_iso)/60) interval_num,
MIN(t.stats_iso) interval_begin,
MAX(t.stats_iso) interval_end,
COUNT(t.id) countid,
SUM(t.montantTTC) sum_subtotal,
SUM(t.montantTTC)/count(t.id) moy,
SUM(COALESCE(a.article_count,0)) article_count
FROM ticket t
LEFT JOIN (
SELECT uid_ticket, COUNT(*) article_count
FROM article
GROUP BY uid_ticket
) a
ON t.uid = a.uid_ticket
WHERE t.annule = 0
AND t.stats_iso BETWEEN '2012-01-01' AND '2012-01-02'
GROUP BY hour_num, interval_num
ORDER BY hour_num, interval_num
Upvotes: 1