Les problèmes suivants sont basés sur les tableaux présentés ci-dessous où les utilisateurs ont certaines transactions. Gardez à l'esprit que la clé primaire du tableau Users se trouve à la fois dans les colonnes User ID et Site ID.
Users
Transaction ID User ID Site ID Transaction Type Transaction Date Amount 4 1 1 Sale 1/1/2017 120 6 1 1 Refund 1/7/2017 -120 7 2 2 Sale 1/5/2017 90 9 2 1 Sale 12/1/2016 30 10 2 1 Sale 1/1/2017 30 11 2 1 Sale 2/1/2017 30 12 2 1 Refund 2/7/2017 [enter image description here][1]-30
Transactions
User ID Site ID Name 1 1 Arthur 2 1 Aaron 2 2 Brett
Ecrivez une requête qui renverra une table avec les colonnes suivantes: ID utilisateur, ID de site, nom d'utilisateur, ventes totales, remboursements totaux, montant net collecté
3 Réponses :
Vérifiez la requête ci-dessous.
SELECT t.UserId, t.SiteId, u.Name, sum(IIF(transaction_type = 'Sale', 1, 0) * isnull(Amount,0)) totalSales, sum(IIF(transaction_type = 'Refund', 1, 0) * isnull(Amount,0)) totalRefunds, sum(isnull(amount, 0)) NetAmount From Transactions t inner join Users u on u.UserId = t.UserId and u.SiteId = t.siteId Group by t.UserId, t.SiteId, u.Name
Vous semblez rechercher une agrégation conditionnelle:
SELECT
u.user_id,
u.site_id,
u.name,
SUM(CASE WHEN t.transaction_type = 'Sale' THEN t.amount ELSE 0 END) total_sale,
SUM(CASE WHEN t.transaction_type = 'Refund' THEN t.amount ELSE 0 END) total_refund,
SUM(t.amount) total
FROM
users AS u
INNER JOIN transactions AS t
ON t.user_id = u.user_id
AND t.site_id = u.site_id
GROUP BY
u.user_id,
u.site_id,
u.name
Si c'était ma question de devoir, j'ajouterais également un total global.
SELECT
t.UserID
,t.SiteID
,u.Name
,SUM(CASE WHEN t.TranType = 'Sale' THEN t.Amount ELSE 0 END) AS tsales
,SUM(CASE WHEN t.TranType = 'Refund' THEN t.Amount ELSE 0 END) AS trefunds
,SUM(t.Amount) AS Total
FROM Transactions t
JOIN Users u ON u.SiteID = t.SiteID
AND u.UserID = t.UserID
GROUP BY
t.UserID
,t.SiteID
,u.Name
UNION
SELECT
999 AS UserId
,999 AS SiteID
,'TOTALS:' AS [Name]
,SUM(CASE WHEN t.TranType = 'Sale' THEN t.Amount ELSE 0 END) AS tsales
,SUM(CASE WHEN t.TranType = 'Refund' THEN t.Amount ELSE 0 END) AS trefunds
,SUM(t.Amount) AS Total
FROM Transactions t
Le résultat ressemblera à ceci:
Remarque: je n'ai pas réfléchi à l'avance et j'ai créé les deux colonnes d'identification Varchar, ma solution facile était le 999 que vous voyez pour garder l'ordre que je voulais .
Cela ressemble beaucoup à des devoirs. Qu'est-ce que tu as essayé jusque-là?
«Écrivez une requête qui ...» Sonne comme un devoir. Eh bien, si nous le faisons pour vous, vous n'apprendrez pas grand-chose.
Spécifiez également le résultat attendu. Et montrez-nous votre tentative de requête actuelle.
À moins d'écrire votre requête pour vous, j'utiliserais une instruction
CASE WHENpour obtenir mes sommes.