SQL-запрос: SUM по трем столбцам с критериями - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть таблица с такими столбцами:

idx | amount | usercol1 | usercol2 | usercol3 | percentage1 | percentage2 | percentage3

Данные обычно такие:

0   | 1500   | 1        | null     | null     | 100         | null        | null
1   | 3000   | 2        | 3        | null     | 50          | 50          | null

Я хотел бы сделать SUM () для суммы каждого пользователя.

Пример:

  • user1 = 1500 * 100/100 (количество * usercol1 / 100)
  • user2 = 3000 * 50/100 (количество * usercol1 / 100)
  • user3 = 3000 * 50/100 (количество * usercol2 / 100)

Я попытался UNION безрезультатно (не суммировал суммы).

Есть ли способ сделать это ?Проблема в том, что он должен GROUP BY имя пользователя (которое я получаю с помощью имени пользователя LEFT OUTER JOIN ON exampletable.usercol1 = usernames.idx).

Я знаю, что это нестандартно и было бы лучше с отношениями из другогоТаблица.Но мне не разрешено менять структуру таблицы.

Большое, большое, большое спасибо!: =)

Таким образом, пример, который дает неправильный результат (кажется, дает только результаты из запроса в середине)

( 
SELECT SUM(projects.amount * (projects.percentage1/100)) as totalproj, 
entities.idx as idx, 
COUNT(projects.idx) as numproj, 
entities.name 
 FROM projects 
 INNER JOIN entities ON projects.usercol1=entities.idx 
 WHERE projects.usercol1=entities.idx 
GROUP BY name ORDER BY totalproj DESC 
) 
UNION ALL
( 
SELECT SUM(projects.amount * (projects.percentage2/100)) as totalproj, 
entities.idx as idx, 
COUNT(projects.idx) as numproj, 
entities.name 
 FROM projects 
 INNER JOIN entities ON projects.usercol2=entities.idx 
 WHERE projects.usercol2=entities.idx 
GROUP BY name ORDER BY totalproj DESC 
) 
UNION ALL
( 
SELECT SUM(projects.amount * (projects.percentage3/100)) as totalproj, 
entities.idx as idx, 
COUNT(projects.idx) as numproj, 
entities.name 
 FROM projects 
 INNER JOIN entities ON projects.usercol3=entities.idx 
 WHERE projects.usercol3=entities.idx 
GROUP BY name ORDER BY totalproj DESC 
)
ORDER BY totalproj DESC 
LIMIT 10

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

Вы можете использовать производную таблицу для имитации первой таблицы нормальной формы, а затем присоединиться к ней.

SELECT SUM(P.amount * (P.percentage/100)) as totalproj, 
       entities.idx as idx, 
       COUNT(P.idx) as numproj, 
       entities.name 
FROM 
(
SELECT idx, amount, usercol1 AS usercol, percentage1 AS percentage
FROM projects
UNION ALL
SELECT idx, amount, usercol2 AS usercol, percentage2 AS percentage
FROM projects
UNION ALL
SELECT idx, amount, usercol3 AS usercol, percentage3 AS percentage
FROM projects
) P
 INNER JOIN entities ON P.usercol=entities.idx 
 WHERE P.usercol=entities.idx 
 GROUP BY name 
 ORDER BY totalproj DESC 
1 голос
/ 14 сентября 2010

используя эти данные (я добавил некоторые странные данные, чтобы убедиться, что математика работала правильно)

0   1500    1   NULL    NULL    100     NULL    NULL
1   3000    2   3       NULL    50      50      NULL
2   780     4   1       3       70      20      50
3   3800    2   4       1       30      20      10

я получил эти результаты

  user  commission
-------  -------------
    1     2036
    2     2640
    3     1890
    4     1306

это то, что вы искали? ниже мой запрос

SELECT  [user]
       ,SUM([commission]) AS commission
FROM    ( SELECT    [usercol1] AS [user]
                   ,( [amount] * [percentage1] ) / 100 AS commission
          FROM      [dbo].[projects]
          WHERE     [usercol1] IS NOT NULL
                    AND [percentage1] IS NOT NULL
          UNION ALL
          SELECT    [usercol2]
                   ,( [amount] * [percentage2] ) / 100
          FROM      [dbo].[projects]
          WHERE     [usercol2] IS NOT NULL
                    AND [percentage2] IS NOT NULL
          UNION ALL
          SELECT    [usercol3]
                   ,( [amount] * [percentage3] ) / 100
          FROM      [dbo].[projects]
          WHERE     [usercol3] IS NOT NULL
                    AND [percentage3] IS NOT NULL
        ) x
GROUP BY [user]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...