SQL-запрос: SUM по трем столбцам с критериями

0

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

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 безрезультатно (не суммировал SUM).

Есть ли способ сделать это? Проблема состоит в том, что она должна быть GROUP BY по имени пользователя (которое я получаю с помощью LEFT OUTER JOIN usernames 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
  • 0
    Не могу понять вопрос: я не могу понять смысл работы, приведенной в разделе «Пример». usercol1 по-разному 1 или 2, а не 100. Кроме того, почему usercol1 соответствует Пользователю 1 и Пользователю 2, а usercol2 соответствует Пользователю 3?
Теги:
sum

2 ответа

3
Лучший ответ

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

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 
  • 0
    Работает как положено!
  • 0
    Огромное спасибо ! У вас отличные аналитические способности!
Показать ещё 4 комментария
1

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

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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню