2010-03-19 3 views
1

Je ne sais pas si cela est possible dans une requête mysql, donc je peux simplement combiner les résultats via php.GROUP BY et SUM date distincte sur 2 tables

J'ai 2 tables: « utilisateurs » et « facturation »

Je suis en train d'activité globale du groupe pour chaque jour qui est disponible dans ces deux tableaux. Les 'utilisateurs' ne sont pas des données historiques, mais la 'facturation' contient un enregistrement pour chaque transaction.

Dans cet exemple, j'indique le statut d'un utilisateur que je souhaite additionner pour la date de création et les montants de dépôt que je souhaite également additionner par date de création. Je me rends compte qu'il y a un peu de déconnexion entre les données, mais j'aimerais les regrouper et les afficher comme indiqué ci-dessous. Cela va me montrer une vue d'ensemble de tous les utilisateurs par quand ils ont été créés et quels sont les statuts actuels à côté des transactions totales.

J'ai essayé UNION ainsi que LEFT JOIN mais je n'arrive pas à travailler.

L'exemple d'union est assez proche mais ne combine pas les dates en une seule ligne.

(
SELECT 
created, 
SUM(status) as totalActive, 
NULL as totalDeposit 
FROM users 
GROUP BY created 
) 
UNION 
(
SELECT 
created, 
NULL as totalActive, 
SUM(transactionAmount) as totalDeposit 
FROM billing 
GROUP BY created 
) 

J'ai aussi essayé d'utiliser une table de recherche de date et se joindre aux dates, mais les valeurs de somme sont ajoutées plusieurs fois.

note: Je ne me soucie pas du tout des userIds mais je l'ai ici pour l'exemple.

utilisateurs Table (où le statut de '1' signifie "actif") (un enregistrement pour chaque utilisateur)

created  | userId | status 

2010-03-01 | 10   | 0 
2010-03-01 | 11   | 1 
2010-03-01 | 12   | 1 
2010-03-10 | 13   | 0 
2010-03-12 | 14   | 1 
2010-03-12 | 15   | 1 
2010-03-13 | 16   | 0 
2010-03-15 | 17   | 1 

table de facturation (enregistrement créé pour chaque instance d'une facturation "transaction"

created  | userId | transactionAmount 

2010-03-01 | 10   | 50 
2010-03-01 | 18   | 50 
2010-03-01 | 19   | 100 
2010-03-10 | 89   | 55 
2010-03-15 | 16   | 50 
2010-03-15 | 12   | 90 
2010-03-22 | 99   | 150 

résultat souhaité:

created  | sumStatusActive  | sumStatusInactive  | sumTransactions 

2010-03-01 | 2         | 1          | 200 
2010-03-10 | 0         | 1          | 55 
2010-03-12 | 2         | 0          | 0 
2010-03-13 | 0         | 0          | 0 
2010-03-15 | 1         | 0          | 140 
2010-03-22 | 0         | 0          | 150 

Table décharge:

CREATE TABLE IF NOT EXISTS `users` (
    `created` date NOT NULL, 
    `userId` int(11) NOT NULL, 
    `status` smallint(6) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 


INSERT INTO `users` (`created`, `userId`, `status`) VALUES 
('2010-03-01', 10, 0), 
('2010-03-01', 11, 1), 
('2010-03-01', 12, 1), 
('2010-03-10', 13, 0), 
('2010-03-12', 14, 1), 
('2010-03-12', 15, 1), 
('2010-03-13', 16, 0), 
('2010-03-15', 17, 1); 


CREATE TABLE IF NOT EXISTS `billing` (
    `created` date NOT NULL, 
    `userId` int(11) NOT NULL, 
    `transactionAmount` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 


INSERT INTO `billing` (`created`, `userId`, `transactionAmount`) VALUES 
('2010-03-01', 10, 50), 
('2010-03-01', 18, 50), 
('2010-03-01', 19, 100), 
('2010-03-10', 89, 55), 
('2010-03-15', 16, 50), 
('2010-03-15', 12, 90), 
('2010-03-22', 99, 150); 

Répondre

1

Essayez ceci:

Select created, sum(status) as totalActive, sum(transactionAmount) as totalDeposit 
From 
((
    SELECT 
    created, 
    status, 
    0 as transactionAmount 
    FROM users 
) 
UNION 
(
    SELECT 
    created, 
    0 as status, 
    transactionAmount 
    FROM billing 
)) as x group by created 
+0

Merci.Je reçois l'erreur suivante si: # 1248 - Chaque table dérivée doit avoir son propre alias – kenitech

+0

L'alias tableau suivant fixe l'erreur, mais les valeurs ne sont pas additionnés correctement: Sélectez créé, somme (statut) comme totalActive, somme (transactionAmount) comme totalDeposit De (( SELECT créé, état , NULL comme transactionAmount FROM utilisateurs ) UNION ( SELECT créé, NULL comme état, transactionAmount FROM facturation )) comme x groupe par créé – kenitech

+0

Ok merci. J'ai modifié la requête pour refléter vos modifications. J'ai aussi changé tous les NULL en zéros. –

0

Ah. Merci à p.g.I.hall j'ai pu modifier la requête et obtenir mon résultat souhaité:

Select 
createdDate, 
SUM(statusSum), 
SUM(transactionAmountSum) 

From 
((
    SELECT 
    created as createdDate, 
    sum(status) as statusSum, 
'0' as transactionAmountSum 
    FROM users 
    GROUP BY createdDate 
) 
UNION 
(
    SELECT 
    created as createdDate, 
    '0' as statusSum, 
    sum(transactionAmount) as transactionAmountSum 
    FROM billing 
    GROUP BY createdDate 
)) 

as x 
group by createdDate 
0

Un mot d'avertissement - votre table users ne dispose pas d'une clé unique. Je vais faire une supposition sauvage ici et dire que vous devriez probablement créer une clé primaire avec la colonne userId.

Une table sans clés primaires signifie que vous n'avez aucune protection contre les mauvaises données dupliquées qui glissent dans vos tables! Aaaaaah!

+0

Merci pour le conseil. J'ai créé ces tableaux dans un but précis pour illustrer le problème principal, donc je n'étais pas vraiment préoccupé par quoi que ce soit d'autre. – kenitech