iT邦幫忙

0

MS SQL 題目問題

  • 分享至 

  • xImage

http://ithelp.ithome.com.tw/upload/images/20170901/20082456Mziw4ftMjI.jpg

題目如上圖
1,2,4是入帳所以為正數
3是扣帳所以要轉成負數
扣帳要從最前面的入帳的數字開始扣

所以select後答案必須是
4 入帳 100

試了一陣子試不出來
感覺還離答案有一段差距
或是根本用錯方法
請各位大神協助!!

看更多先前的討論...收起先前的討論...
眼袋 iT邦新手 5 級 ‧ 2017-09-01 09:37:47 檢舉
sum 跟group 試試吧
答案為什麼是50 ?
算到最後應該是100 .
算成50的邏輯是什麼? (為什麼算成50?)
阿海 iT邦新手 2 級 ‧ 2017-09-01 11:40:42 檢舉
抱歉已改答案
正解應該是4 入帳 100

3為扣帳100,因先減掉1 入帳50後
剩餘的50在減去 2 入帳100
最後在加上 4 入帳 50
所以是4 入帳 100
阿海 iT邦新手 2 級 ‧ 2017-09-01 11:43:09 檢舉
如果4 不加入
只有1 2 3的話
正解才是2 入帳 50

算法是 由上一層一層往下算
3為扣帳100,因先減掉1 入帳50後
剩餘的50在減去 2 入帳100
所以答案是2 入帳 50
小魚 iT邦大師 1 級 ‧ 2017-09-01 11:55:16 檢舉
為什麼是4, 為什麼是2,理由是什麼?
另外為什麼不要用正負號就好,
用入帳跟扣帳感覺有點麻煩...
阿海 iT邦新手 2 級 ‧ 2017-09-01 12:01:35 檢舉
扣帳(負數) 應要先減去 第一個正數(入帳)
等到第一個正數(入帳)不夠的時候
在往下找正數(入帳) 減掉 剛剛不夠扣的
依此類推
這樣a b才能野正確答案
有些資料在儲存的時候不適合儲存負數,比如說商品退貨的明細資料,單價就不會存成負數,而是將數量儲存成負數,這樣正負相乘的總金額才會是負數。不過這時候就需要有其他的欄位值去判斷這個欄位的退貨交易是負值(如數量小於0,因為是負的)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
石頭
iT邦高手 1 級 ‧ 2017-09-01 10:47:21

看一下合不合用

-- [type] A 為入帳
-- [type] B 為出帳
CREATE TABLE #Temp
(
	[type] VARCHAR(10),
	Price  INT
)
INSERT INTO #Temp ([type],Price)

VALUES
('A',50),
('A',100),
('B',100),
('A',50)

SELECT 
  TOP 1  
  (SELECT SUM(PRICE)FROM #TEMP WHERE [type]='A') - (SELECT SUM(PRICE)FROM #TEMP WHERE [type]='B') AS Totle  
FROM #TEMP

看更多先前的回應...收起先前的回應...
阿海 iT邦新手 2 級 ‧ 2017-09-01 11:40:12 檢舉

抱歉一開始發問答案寫錯了
這題正解應該是4 入帳 100

用你的來跑上圖的table
得到的答案會是
1 入帳 100

你的方法是算出數字,但a,b排序是錯的
我想知道的是怎麼樣讓
C欄位從 1和2計算後的數
再算出3,之後再算出4
依此類推

石頭 iT邦高手 1 級 ‧ 2017-09-01 15:34:10 檢舉

看一下合不合用

-- [type] A 為入帳
-- [type] B 為出帳
CREATE TABLE #Temp
(
	Sn     BIGINT,
	[type] VARCHAR(10),
	Price  INT
)
DECLARE @Index BIGINT = 1
DECLARE @MAXCount BIGINT 
DECLARE @TotlePrice BIGINT = 0
DECLARE @TempType   VARCHAR(10)
DECLARE @TempPrice  INT

INSERT INTO #Temp (Sn,[type],Price)
VALUES
(1,'A',50),
(2,'A',100),
(3,'B',100),
(4,'A',50)


SET @MAXCount = (SELECT COUNT(sn) FROM #TEMP)

WHILE(@Index <= @MAXCount)
BEGIN
	SET @TempType  =  (SELECT [type] FROM #Temp WHERE sn=@Index)
	SET @TempPrice =  (SELECT PRICE FROM #Temp WHERE sn=@Index)

	IF  @TempType = 'A'
	BEGIN
		SET @TotlePrice = @TotlePrice + @TempPrice
	END	
	ELSE IF @TempType = 'B'
	BEGIN
		SET @TotlePrice = @TotlePrice - @TempPrice
	END

	PRINT(@TempType)
	PRINT(@TotlePrice)
	SET @Index = @Index + 1
END

--SELECT @TotlePrice AS Totle

drop table #Temp
阿海 iT邦新手 2 級 ‧ 2017-09-04 11:06:27 檢舉

無法執行,還在找原因 看哪邊有問題
但應該是這個解法!!
我是直接略過CREATE TABLE和INSERT INTO
改用我的TABLE

不過直接運行你的也不行!!

石頭 iT邦高手 1 級 ‧ 2017-09-04 13:15:03 檢舉

你的不行是哪邊有錯?

阿海 iT邦新手 2 級 ‧ 2017-09-04 15:43:06 檢舉

DECLARE @Index BIGINT = 1
DECLARE @TotlePrice BIGINT = 0
無法指派預設值給本機變數。

必須宣告純量變數

好像是因為我是SQL2005的關系
我裝2008試看看
如果不能在來回報

阿海 iT邦新手 2 級 ‧ 2017-09-04 16:21:11 檢舉

下載太慢了,結果我直接在2005
宣告後SET變數值,就可以了
不過答案還有點出路
這題答案是4 A 100
是因為最後入庫50 所以停在4 A 100

如果4 不加入,只有sn 1,2,3的話
正解是2,A,50
原因如下
sn3為B,100
應該要先減掉sn1 A,50後
剩餘的50在減去sn2 A,100
如果B已用完,下方只剩A或沒東西了
@Index和@TempType應停在sn2的地方也就是 2 A
@TotlePrice為最後結果50

所以答案是2 入帳 50
但@Index-1,@TempType卻是停留在最後一筆

石頭 iT邦高手 1 級 ‧ 2017-09-04 17:04:59 檢舉

其實...在下只是拋磚引玉
基本上我是跟你說 我的解題方向是怎麼樣
如果不合適 您可以在微調

阿海 iT邦新手 2 級 ‧ 2017-09-04 17:14:43 檢舉

OK 非常感謝!!
已在微調了!!

0
純真的人
iT邦大師 1 級 ‧ 2017-09-04 14:49:07

declare @table as Table(
a int
,b nvarchar(50)
,c int
)

insert into @table
values(1,'入帳',50)
,(2,'入帳',100)
,(3,'扣帳',100)
,(4,'入帳',50)

select Sum(case when b = '扣帳' then -c else c end) as Sum_Cash from @table

我要發表回答

立即登入回答