iT邦幫忙

0

關於sql語法的sum.....

A資料表aid關連b資料表bid(一對多)

現在在a資料表中建立新欄位叫aa
如何將aa的欄位值等於b資料表中所對應的某欄位數的加總

例如說
a表資料aid=1對應該b表資料bid=1時(但b表bid=1有8筆資料)
將8筆資料做sum後的值會將值放回a表資料的aa欄位

= =這種東西要畫面才能快速明白了解
真不適合文字說明.....

4
kaowoei
iT邦研究生 4 級 ‧ 2011-08-16 09:59:38
最佳解答

我倒是覺得樓主提出的需求「在a資料表中的aa的欄位放b資料表中所對應的某欄位數的加總」這樣子實作上雖然技術可行,但是會有「一旦b資料表的資料變更,就會發生aa欄位紀錄的值和b資料表實際的值不一致的問題」。

除非能夠確定b資料表永遠不會變更或者是為了作大量彙整計算工作,有效能上的議題,才去把SUM的值寫在a資料表中。

若只是做單純的頁面或報表SELECT,我會建議把SUM的工作寫成function,然後在SELECT裡去呼叫就可以了。這樣會比較有彈性。

10
fox18
iT邦研究生 5 級 ‧ 2011-08-15 16:29:11

假設一下
A資料表
id name
1 A
2 B
3 C

B資料表
id value
1 2
1 3
1 2
2 4
2 3
3 1
3 2
3 3

SELECT a.id, a.name, SUM(b.value) AS aa
FROM dbo.A as a cross JOIN
dbo.B as b
where a.id=b.id
GROUP BY a.id,a.name
這樣子不知道符不符合你的需求??

ghost234 iT邦新手 4 級 ‧ 2011-08-15 16:56:06 檢舉

我想到的方法也是這樣子,但不是我要的

我在前端要拉『A資料表B欄位』出來
所以『A資料表B欄位』這條件就固定住了...

我應該這樣子問
SQL SERVER有沒有辨法
在A資料表B欄位上寫入一個語法(做上述的加總SUM)
讓B欄位會等於上述的加總SUM

fox18 iT邦研究生 5 級 ‧ 2011-08-15 18:35:36 檢舉

問一下這樣的結果是你要的嗎?
是的話你可以使用預存程序的方式將語法寫在裡面
接著就能在前端指定使用該預存程序來得到這樣的結果
又或者是你也可以在資料庫裡先新增一個檢視 然後語法帶進去得到一個檢視的table
前端那邊只要下指令select這個檢視也可以直接得到這樣的結果

6
一級屠豬士
iT邦高手 1 級 ‧ 2011-08-15 18:03:39

手頭上沒SQL Server,只有MySQL,但是也許可以參考一下.

<pre class="c" name="code">
CREATE TABLE it0815a (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(5) NOT NULL,
sumb INT
);

CREATE TABLE it0815b (
id INT NOT NULL,
valuex INT NOT NULL
);

INSERT INTO it0815a(id,name) VALUES
(1,'A'), (2, 'B'), (3, 'C');

INSERT INTO it0815b VALUES
(1,2),(1,3),(1,2),(2,4),(2,3),(3,1),(3,2),(3,3);
---------------------------
UPDATE it0815a a
LEFT JOIN (SELECT id, sum(valuex) as sumx 
            FROM it0815b
            GROUP BY id) b
ON a.id = b.id
SET a.sumb = b.sumx;

select * from it0815a;
+----+------+------+
| id | name | sumb |
+----+------+------+
|  1 | A    |    7 |
|  2 | B    |    7 |
|  3 | C    |    6 |
+----+------+------+
2
davidliu9116
iT邦研究生 3 級 ‧ 2011-08-16 13:28:31

在b資料表建立觸發程序
當b資料表有異動時SUM後直接更新a資料表的加總欄位

不要告訴我你不會寫觸發程序喔Orz
真的不會的話就看一下書吧哈哈

我要發表回答

立即登入回答