0
votes

Groupe SQL par et rejoindre en fonction d'une table client étrange

J'ai 3 tables que je veux rejoindre ensemble et le regrouper pour obtenir des informations sur l'adhésion client. Mon code travaille pour regrouper la table de base ensemble, mais il se casse à la partie de la jointure et je ne peux pas comprendre pourquoi. XXX PRE>

select t1.transaction_id, sum(t1.product_cost), t1.order_date, t3.client_type
from sales_detail t1
left join (select DISTINCT  transaction_ID, other_id, fruits from connector) t2
ON t1.transaction_ID=t2.transaction_ID
left join (select DISTINCT order_id, client_type, fruits from client information) t3 
ON t2.other_id=t3.other_id and t2.item=t3.item
where t1.payment_type='mastercard' and t1.order_Date between '2020-10-01' and'2020-10-31'
and country != 'canada'
GROUP BY t1.transaction_id, t1.order_date, t3.client_type;


1 commentaires

J'ai supprimé les balises de base de données incohérentes. Veuillez baliser uniquement avec la base de données que vous utilisez vraiment.


4 Réponses :


1
votes

Je pense que c'est des jointures et de l'agrégation. Pour plus d'efficacité, vous pouvez pré-globaliser dans une sous-requête, puis rejoindre: xxx

Notez que j'ai réécrit le filtre sur ordre_date pour utiliser des intervalles à moitié ouverts plutôt que entre . Cela gère correctement le cas lorsque vos dates ont une partie de temps.


2 commentaires

Merci cela fonctionne! Question Bien que cela fonctionne parfaitement sur SQL Fiddle, mais pour les données réelles, le temps d'exécution est extrêmement lent. Y a-t-il un bon moyen de recommander que vous pouvez accélérer la requête?


@eeazzzz: Cela ressemble à une question différente, pour laquelle vous auriez besoin de fournir plus d'informations (structure de table, index existants, plan d'exécution, ...). Je ne peux que recommander accepter cette réponse et Demander une nouvelle question pour cela.



0
votes

De ce que j'ai compris, votre code fonctionne bien que cela ne souhaite pas utiliser un joint interne et il ne parvient pas à ajouter un rejoindre . Je pense que ce qui se passe est une défaillance due aux éléments null . Pour ajouter un élément null et ne pas obtenir une erreur, vous devez utiliser une fonction qui modifie la valeur null sur 0 . .

une de ces fonctions est le isnull (YourColumn, 0) fonction de T-SQL . La documentation .


0 commentaires

0
votes

Je peux voir que dans la table des résultats, vous n'avez besoin que de clients Mastercard , vous devriez donc Utiliser une jointure intérieure là-bas, alors que seuls les clients qui utilisaient MasterCard seront pris en compte. Alors que la requête restante est acceptable, je suppose, mais le problème principal était la jointure sur les informations du client.


0 commentaires

0
votes

Je pense que sur la réponse avec GMB, vous devez également rejoindre la colonne de l'article sinon vous obtiendrez plusieurs lignes de sortie.

select sd.*, ci.client_type
from (
    select order_date, transaction_id, sum(product_cost) product_cost
    from sales_detail
    group by order_date, transaction_id
) sd
inner join connector c on c.transaction_id = sd.transaction_id
inner join client_information ci on ci.other_id = c.other_id and ci.item = c.item


2 commentaires

Merci cela fonctionne! Question Bien que cela fonctionne parfaitement sur SQL Fiddle, mais pour les données réelles, le temps d'exécution est extrêmement lent. Y a-t-il un bon moyen de recommander que vous pouvez accélérer la requête?


Comme je n'ai aucune idée de ce que vous ressemblez à votre schéma et combien de données il y a et d'autres détails, je ne peux fournir aucune idée de la façon de faire cela. Veuillez marquer la réponse comme approprié et poser une autre question.