2010-09-14 73 views
0

我有一個表像這些列:SQL查詢:SUM上三列,標準

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)
  • 用戶3 = 3000 * 50/100(金額* usercol2/100)

我試過UNION無濟於事(沒有總結SUM)。

有沒有辦法做到這一點?問題在於它應該使用GROUP BY用戶名(我使用LEFT OUTER JOIN用戶名開啓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? – Hammerite 2010-09-14 16:58:18

回答

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

按預期工作! – oimoim 2010-09-15 08:52:53

+0

很多很多,謝謝!你有很棒的分析能力! – oimoim 2010-09-15 08:53:09

+0

還有一件事:如果我添加一個標準前例。 :WHERE P.country = 2 SUM結果爲NULL。你有什麼想法,爲什麼? – oimoim 2010-09-15 12:14:48

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]