iT邦幫忙

0

表格的資料結構或演算法

https://ithelp.ithome.com.tw/upload/images/20210907/20127836G1BmWOZwtQ.png

請問如果我需要做查表的動作
類似這樣圖中這樣,需要兩個參數來找出最終要的結果

原本想說把資料丟進資料庫,然後用語法來查,
但是我想不到該如何做出類似這種二維表的做法

還是說這種需求應該要用特殊的資料結構來存比較好?

求搜尋關鍵字或是SQL語法
感謝大家

=========== 補充 ==========

抱歉沒有說明清楚
1~1.9指的是需要當輸入值為1~1.9時查詢這個欄位(不是string)
並且跟row的50,60,70查詢到正確的數值

小魚 iT邦大師 1 級 ‧ 2021-09-07 08:58:49 檢舉
所以需求是甚麼?
問題:第一列 = 欄位名 ?
假如第一列是欄位名,就很好處理,借 J 大的語法抄一下
建表
create table tablename (
key INT,
[1~1.9] INT,
[2~2.9] INT,
[3~3.9] INT,
[4~4.9] INT
)

資料
insert into tablename values (50,1356,1546,1703,1905)
insert into tablename values (60,1768,1911,2134,2256)
insert into tablename values (70,1920,2034,2200,2390)

查詢
SELECT * FORM tablename;
是想做類似Excel的樞扭的效果嗎? 找看看PIVOT? 不過不是所有資料庫都支援
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
japhenchen
iT邦超人 1 級 ‧ 2021-09-07 08:57:12
最佳解答

資料庫建表

create table tablename (
    x1 float ,
    x2 float ,
    y float ,
    value float
   )

資料

insert into tablename (x1,x2,y,value) values (1,1.9,50,1356) , (2,2.9,50,1546) ,(3,3.9,50,1703) ,(4,4.9,50,1905) , (1,1.9,60,1768) 
-- ................. 以下比較辦理

查詢

declare @A as float 
set @A = 4.3
declare @B as float 
set @B = 70

select value from tablename where (@A between x1 and x2) and (y = @B)

(更新,之前between用法有誤,改正)

簡單的DEMO

skycover iT邦新手 4 級 ‧ 2021-09-07 12:13:46 檢舉

一直想用二維的方式來解
原來還可以有這種做法
我先試試看 謝謝

別把問題複雜化,一維二維三維,都是一個where後面跟著一堆AND就對了

0
Hankz
iT邦新手 2 級 ‧ 2021-09-07 10:42:34

最標準的作法:多對多

執行結果

-- 欄
CREATE TABLE col (
id INT NOT NULL AUTO_INCREMENT,
min_num FLOAT,
max_num FLOAT,
PRIMARY KEY (id)
);
INSERT INTO col
VALUES (null, 1, 1.9);
INSERT INTO col
VALUES (null, 2, 2.9);
INSERT INTO col
VALUES (null, 3, 3.9);
SELECT * FROM col;

-- 列
CREATE TABLE row (
id INT NOT NULL AUTO_INCREMENT,
value FLOAT,
PRIMARY KEY (id)
);
INSERT INTO row
VALUES (null, 50);
INSERT INTO row
VALUES (null, 60);
SELECT * FROM row;

-- 資料
CREATE TABLE data (
id INT NOT NULL AUTO_INCREMENT,
col_id INT NOT NULL,
row_id INT NOT NULL,
data VARCHAR(255),
PRIMARY KEY (id)
);
INSERT INTO data
VALUES (null, 1, 1, '1356');
INSERT INTO data
VALUES (null, 1, 2, '1768');
INSERT INTO data
VALUES (null, 1, 3, '1920');
INSERT INTO data
VALUES (null, 2, 1, '1546');
INSERT INTO data
VALUES (null, 2, 2, '1911');
INSERT INTO data
VALUES (null, 2, 3, '2034');

SELECT CONCAT(col.min_num, '~', col.max_num) as col_value, row.value as row_value, data.data
FROM col, row, data
WHERE col.id = data.col_id
AND row.id = data.row_id
-- 尋找欄=1~1.9、列=60
AND (1.3 BETWEEN col.min_num AND col.max_num)
AND row.value = 60
;
skycover iT邦新手 4 級 ‧ 2021-09-07 11:51:39 檢舉

抱歉沒有說明清楚
column是數值表示1~1.9 不是字串

Hankz iT邦新手 2 級 ‧ 2021-09-07 14:50:30 檢舉

已更新
如果列也要用範圍,用相同方式判斷即可

skycover iT邦新手 4 級 ‧ 2021-09-07 17:06:02 檢舉

感謝回覆!

我要發表回答

立即登入回答