hsiung632 wrote:
. Select...(恕刪)


這位大大,我不是很確定你的sql是在哪一個環境執行

印象中你的1,2,3 SQL都無法執行
主要問題是group by 跟Max() function的關係
電腦工程師,有問題可以找我討論 Raxel
嘿嘿,剛考完資料庫不久,現學現賣一下

SELECT a.客戶名稱, a.進貨品名, a.進貨日期, a.進貨數量, a.進貨單價, count( * )
FROM [表格名稱] a, [表格名稱] b
WHERE a.客戶名稱 = b.客戶名稱
AND a.進貨品名 = b.進貨品名
AND a.進貨日期 <= b.進貨日期
GROUP BY a.客戶名稱, a.進貨品名, a.進貨日期, a.進貨數量, a.進貨單價
HAVING count( * ) = 1


用了SELF JOIN 的小技巧,應該會比子查詢節省資源,
不過當同客戶同產品進貨次數非常多時可能就難說了。
主要原理就是把相同客戶名稱 + 進貨品名拼起來作比對,
然後比對日期的部份比較抽象

a.進貨日期 <= b.進貨日期
...
HAVING count( * ) = 1

最大的日期只會小於等於自己,故只會得到一筆,照這個想法得出
確認日期用字串也沒問題喔

修改一下,如果是要該客戶不分產品最後一次進貨資料的話,就改成如下:
SELECT a.客戶名稱, a.進貨品名, a.進貨日期, a.進貨數量, a.進貨單價, count( * )
FROM [表格名稱] a, [表格名稱] b
WHERE a.客戶名稱 = b.客戶名稱
AND a.進貨日期 <= b.進貨日期
GROUP BY a.客戶名稱, a.進貨品名, a.進貨日期, a.進貨數量, a.進貨單價
HAVING count( * ) = 1

也就是 [AND a.進貨品名 = b.進貨品名] 這行刪掉即可


順便補上子查詢作法:
SELECT DISTINCT *
FROM [表格名稱]
WHERE (客戶名稱, 進貨日期) IN
(SELECT 客戶名稱, MAX(進貨日期) FROM [表格名稱] GROUP BY 客戶名稱)


以上小弟淺見,希望有幫助到
{
drop table xxx_tab;
create table xxx_tab(
xxx01 char(10),
xxx02 char(20),
xxx03 char(08),
xxx04 smallint,
xxx05 smallint);
insert into xxx_tab values('aaa', 'TTT', '20080110',10, 207);
insert into xxx_tab values('aaa', 'TTT', '20080510', 6, 205);
insert into xxx_tab values('bbb', 'UUU', '20080120', 5, 248);
insert into xxx_tab values('bbb', 'UUU', '20080520', 8, 245);
}
select * from xxx_tab where xxx03 in (
select max(xxx03) from xxx_tab group by xxx01);

得到結果如下:
xxx01 xxx02 xxx03 xxx04 xxx05

aaa TTT 20080510 6 205
bbb UUU 20080520 8 245
VincentCCH wrote:

{
drop table xxx_tab;
create table xxx_tab(
xxx01 char(10),
xxx02 char(20),
xxx03 char(08),
xxx04 smallint,
xxx05 smallint);
insert into xxx_tab values('aaa', 'TTT', '20080110',10, 207);
insert into xxx_tab values('aaa', 'TTT', '20080510', 6, 205);
insert into xxx_tab values('bbb', 'UUU', '20080120', 5, 248);
insert into xxx_tab values('bbb', 'UUU', '20080520', 8, 245);
}
select * from xxx_tab where xxx03 in (
select max(xxx03) from xxx_tab group by xxx01);

得到結果如下:
xxx01 xxx02 xxx03 xxx04 xxx05

aaa TTT 20080510 6 205
bbb UUU 20080520 8 245




中間加入一行
insert into xxx_tab values('bbb', 'UUU', '20080510', 8, 245);

馬上就破功了.....
電腦工程師,有問題可以找我討論 Raxel
SELECT RTRIM(MA003) + '-' + RTRIM(MA001) AS 廠商品號, MA012 AS 進貨日期
FROM dbo.MOCMA as a join
(SELECT MA003, MA001, MAX(MA012) as MA012
FROM dbo.MOCMA
GROUP BY MA003,MA001) as b on (a.MA003 = b.MA003 and a.MA001 = b.MA001 and a.MA012 = b.MA012)
ORDER BY RTRIM(MA003) + '-' + RTRIM(MA001)
顯示每一個"進貨品名"的最後一筆資料

select a.* from
table a,
(select 客戶名稱,進貨品名,max(進貨日期)
from table group by 客戶名稱,進貨品名) b
where a.客戶名稱=b.客戶名稱
and a.進貨品名=b.進貨品名
and a.進貨日期=b.進貨日期

顯示每一個"客戶名稱"的最後一筆資料

select a.* from
table a,
(select 客戶名稱,max(進貨日期)
from table group by 客戶名稱) b
where a.客戶名稱=b.客戶名稱
and a.進貨日期=b.進貨日期
電腦工程師,有問題可以找我討論 Raxel
elase wrote:
SELECT RTR...(恕刪)


elase大大:

依照你這個語法

我撈不出資料

不過還是感謝眾人的幫忙

繼續try
SELECT a.MA003 AS 廠商, a.MA001 AS 品號, a.MA012 AS 進貨日期, COUNT( * )
FROM dbo.MOCMA a, dbo.MOCMA b
WHERE a.MA003 = b.MA003
AND a.MA001 = b.MA001
AND a.MA012 <= b.MA012
GROUP BY a.MA003, a.MA001, a.MA012
HAVING COUNT( * ) = 1

或是

SELECT MA003 AS 廠商, MA001 AS 品號, MA012 AS 進貨日期
FROM dbo.MOCMA
WHERE (MA003, MA001, MA012) IN
(SELECT MA003, MA001, MAX(MA012) FROM dbo.MOCMA GROUP BY MA003, MA001)

試試看如何?
boneyhsu wrote:
請教各位先進,我有一...(恕刪)


如果每個客戶一天只會有一筆進貨資料
可以試試以下的查詢

SELECT * FROM TABLE WHERE 客戶名稱+進貨日期 IN (SELECT 客戶名稱+MAX(進貨日期) WHERE TABLE GROUP BY 客戶名稱)

應該就可以查詢到你要的資料!!
我用MySQL這樣就可以了..

SELECT CONCAT(客戶名稱,'-',進貨品名) "廠商品號", MAX(進貨日期) "進貨日期"
FROM 資料表
GROUP BY 客戶名稱, 進貨品名
PS:GROUP BY後面也可以用CONCAT(客戶名稱,'-',進貨品名)

如果照你的語法改的話可能是..

SELECT RTRIM(MA003) + '-' + RTRIM(MA001) AS 廠商品號, MAX(MA012) AS 進貨日期
FROM dbo.MOCMA
GROUP BY RTRIM(MA003) + '-' + RTRIM(MA001)
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!