1
votes

J'ai besoin d'aide pour créer des colonnes avec des agrégations

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é


4 commentaires

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 WHEN pour obtenir mes sommes.


3 Réponses :


0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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:

entrez description de l'image ici

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 .


0 commentaires