全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1030
推到 Plurk!
推到 Facebook!

FIREBIRD 有關 SUM() 的問題

缺席
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-09-14 15:06:59 IP:59.120.xxx.xxx 未訂閱
請問各位!

我使用 FIREBIRD 2.X版資料庫, 我始終沒有特別去注意這個問題, 直到最近要用MASTER, DETAIL 關聯做 SUM() 才發現

MASTER 有 6筆記錄
KEYFIELD
1
2
3
4
5
6

DEETAIL 有 6筆
KEYFIELD COUNTS
1 10
1 20
2 10
4 10
3 0
6 10

如果程式是分兩段來做, 先調出 MASTER 6 筆, 再去算 DETAIL 的 COUNTS 值, 這是沒問題的,
但我用了select join方式取得 detail COUNTS值, 結果detail 的 3 不會出現, 導致 master 的3 沒有被顯示出來,
我的問題是
select keyfield, sum(counts) from detail 的結果, sum為0的不會出現,
要如何才能讓 detail sum()=0 的記錄也會出現? 沒遇過這個問題, 始終以為0 應該也是要出現的才對
想要的結果是
1 30
2 10
4 10
3 0 --> 出不來
6 10
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-09-14 17:12:08 IP:59.120.xxx.xxx 未訂閱
不好意思, 上帖的情況後來查證有一點出入,

Detail 的 KeyField = 3 的那一筆是沒有RECORD的, 也就是說
MASTER 有 6筆記錄
KEYFIELD
1
2
3
4
5
6
DEETAIL 有 5筆
KEYFIELD COUNTS
1 10
1 20
2 10
4 10
6 10
想要的結果是
1 30
2 10
4 10
3 0 --> 這筆結果能出現如左
6 10

我的語法是
select a.KEYFIELD, b.COUNTS from (select MASTER.KEYFIELD from MASTER where xxxxx) a, (select sum(DETAIL.COUNTS) as COUNTS from DETAIL where xxxx group by DETAIL.COUNTS) b where a.KEYFIELD=b.KEYFIELD
編輯記錄
P.D. 重新編輯於 2015-09-14 17:13:49, 註解 無‧
Ray_Lin
一般會員


發表:0
回覆:30
積分:11
註冊:2015-07-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-09-14 17:26:25 IP:114.32.xxx.xxx 訂閱
這很正常,因為DETAIL沒有資料,當然就顯示不出來,如果要以MASTER為主,那就要加上Master的參照
以MSSQL為例
G_CUST是你的MASTER,G_SO 是DETAIL,語法如下

SELECT G.ID_CUST,ISNULL(A.CNT,0) FROM (SELECT ID_CUST,COUNT(*) AS CNT FROM G_SO group by ID_CUST) A
RIGHT JOIN G_CUST G ON G.ID_CUST=A.ID_CUST
ORDER BY G.ID_CUST
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-09-15 08:44:41 IP:218.35.xxx.xxx 訂閱
select M.keyfield,
(select count(d.keyfield)
from Detail D
where d.keyfield = m.keyfield) as countDtl
from Master


===================引 用 P.D. 文 章===================
請問各位!

我使用 FIREBIRD 2.X版資料庫, 我始終沒有特別去注意這個問題, 直到最近要用MASTER, DETAIL 關聯做 SUM() 才發現

MASTER 有 6筆記錄
KEYFIELD
1
2
3
4
5
6

DEETAIL 有 6筆
KEYFIELD COUNTS
1 10
1 20
2 10
4 10
3 0
6 10

如果程式是分兩段來做, 先調出 MASTER 6 筆, 再去算 DETAIL 的 COUNTS 值, 這是沒問題的,
但我用了select join方式取得 detail COUNTS值, 結果detail 的 3 不會出現, 導致 master 的3 沒有被顯示出來,
我的問題是
select keyfield, sum(counts) from detail 的結果, sum為0的不會出現,
要如何才能讓 detail sum()=0 的記錄也會出現? 沒遇過這個問題, 始終以為0 應該也是要出現的才對
想要的結果是
1 30
2 10
4 10
3 0 --> 出不來
6 10
------
Kadee/BigRed Ent.
www.tw165.com
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-09-15 14:27:16 IP:210.61.xxx.xxx 未訂閱
解法1: 

Select A.KEYFIELD, Sum(B.COUNTS) COUNTS

From Master A

Left Join Detail B on A.KEYFIELD = B.KEYFIELD

Group by A.KEYFIELD

Order by A.KEYFIELD



解法2:

Select A.KEYFIELD,

COUNTS = IsNull((Select sum(DETAIL.COUNTS) COUNTS

From Detail

Where Detail.KEYFIELD = A.KEYFIELD), 0)

From Master A

Where ~~~~
編輯記錄
老大仔 重新編輯於 2015-09-15 14:28:04, 註解 無‧
老大仔 重新編輯於 2015-09-15 14:28:28, 註解 無‧
老大仔 重新編輯於 2015-09-15 14:28:58, 註解 排版一直有問題啊QQ‧
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-09-15 21:59:38 IP:118.169.xxx.xxx 未訂閱
先感謝兩位的指導, 程式中真正的語法比我舉例的要複雜更多, 目前正在忙一個案子, 等抽空我消化一下看能不能組合起來, 謝謝!
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-09-18 14:24:54 IP:118.160.xxx.xxx 未訂閱
老大仔的第一個用法, 測試結果 master 的3 還是不會出來,
第二個用法, 我用 iboconsole 測試, 不識得 isnull()函式, 我直接寫到 delphi中可以執行, 但出來也是一樣的結果,
可能是我的語法還是有問題
完整的語法如下
[code delphi]
select a.POSHEAD, a.POSBODY, a.DEPTNO, a.FORMDATE, a.VIPNO, a.CUSTNAME,
a.ARS, a.CASH, a.VISA, a.PAYED, a.COUNTERNO,
a.COUNTDATE, a.COUNTTIME, b.COUNTS
from
(select DP000.POSHEAD, DP000.POSBODY, DP000.DEPTNO, DP000.FORMDATE,
DP000.VIPNO, DP000.CUSTNAME, DP000.ARS, DP000.CASH,
DP000.VISA, DP000.PAYED, DP000.COUNTERNO, DP000.COUNTDATE, DP000.COUNTTIME
from DP000
where DP000.FORMTYPE="1" and DP000.FORMDATE= '20140302' and DP000.DEPTNO= 'A'
order by DP000.COUNTDATE, DP000.COUNTTIME
) a,

(select DP001.POSHEAD, DP001.POSBODY, IsNull(DP001.COUNTS), 0) as COUNTS
from DP001
where DP001.FORMTYPE="1" and DP001.ISCONFIRM="Y" and DP001.FORMDATE= '20140302' and DP001.DEPTNO= 'A'
group by DP001.POSHEAD, DP001.POSBODY
) b
[/code]
目前還是找不到任何方法可以把
master 有6筆record , 對應到 detail 有4筆時, master 剩下的兩筆在detail中不存在, 而且在 sql 中一樣要秀出 master 6筆, 但對不到 detail的2筆能呈現數量 0 的功能,
先感謝以上協助指導的兩位前輩!
編輯記錄
P.D. 重新編輯於 2015-09-18 14:26:36, 註解 無‧
系統時間:2017-11-20 12:04:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!