NO NAME ID
2200 量測 A12180017
2200 量測 H11124-010
2200 量測 S10460-251
2200 量測 S10460-252
2200 量測 S10465-211
2200 量測 S10465-212
2200 量測 S10469-011
2200 量測 S10469-012
2200 量測 S10469-060
2200 量測 S10469-100
2200 量測 S10469-200
以上是我的TABLE , 我想要查出
ID 中做算筆數 , 但S,H的後三碼為011 , 012 視為同一個 ,故後一碼要減一位後作group , 所以說只要有"-"的都要扣一碼...
結果如下...
NO NAME ID
2200 量測 A12180017
2200 量測 H11124-01
2200 量測 S10460-25
2200 量測 S10465-21
2200 量測 S10469-01
2200 量測 S10469-06
2200 量測 S10469-10
2200 量測 S10469-20
以上mysql 是否可以做到呢 ,煩請各位先進幫忙 ,超感謝
<pre class="c" name="code">
SELECT (CASE WHEN (INSTR(ID, '-') = 0) THEN ID ELSE LEFT(ID, LENGTH(ID)-1) END) AS NewID, COUNT(1)
FROM test0315
GROUP BY NewID;
+-----------+----------+
| NewID | COUNT(1) |
+-----------+----------+
| A12180017 | 1 |
| H11124-01 | 1 |
| S10460-25 | 2 |
| S10465-21 | 2 |
| S10469-01 | 2 |
| S10469-06 | 1 |
| S10469-10 | 1 |
| S10469-20 | 1 |
+-----------+----------+
要用db來做字串的處理,
可能不是那麼方便,
也許不需要如此地大材小用。
不如 select 出來的結果重導輸出成一檔案,
再以此檔案來做您所需要的計算。
假設您已把 select 的語法寫在 output.sql 檔,
然後執行:
<pre class="c" name="code">mysql -u user -p dbname < output.sql > result.txt
result.txt 就如同您問題中的資料內容。
如果該環境是在Linux/Unix下,
就可很方便透過以下的指令就算出您要的結果:
如果不要管 非SH開頭的話:
<pre class="c" name="code">$ awk -F" " '$3 ~ /[SH]/' result.txt | sed -e 's/.$//g'
2200 量測 H11124-01
2200 量測 S10460-25
2200 量測 S10460-25
2200 量測 S10465-21
2200 量測 S10465-21
2200 量測 S10469-01
2200 量測 S10469-01
2200 量測 S10469-06
2200 量測 S10469-10
2200 量測 S10469-20
這樣就算出次數:
<pre class="c" name="code">$ awk -F" " '$3 ~ /[SH]/' result.txt | sed -e 's/.$//g'|sort|uniq -c
1 2200 量測 H11124-01
2 2200 量測 S10460-25
2 2200 量測 S10465-21
2 2200 量測 S10469-01
1 2200 量測 S10469-06
1 2200 量測 S10469-10
1 2200 量測 S10469-20
如果 非SH開頭也一定要列出來的話,就這樣:
<pre class="c" name="code">$ sed "/ [SH]/ s/.$//g" result.txt
2200 量測 A12180017
2200 量測 H11124-01
2200 量測 S10460-25
2200 量測 S10460-25
2200 量測 S10465-21
2200 量測 S10465-21
2200 量測 S10469-01
2200 量測 S10469-01
2200 量測 S10469-06
2200 量測 S10469-10
2200 量測 S10469-20
若要算出現次數的話,
編一個count.awk的文字檔:
<pre class="c" name="code">{
freq[$0]++
}
END {
for (line in freq)
printf "%s %d\n", line, freq[line]
}
執行:
<pre class="c" name="code">$ sed "/ [SH]/ s/.$//g" result.txt | awk -f count.awk
2200 量測 S10465-21 2
2200 量測 S10469-06 1
2200 量測 S10460-25 2
2200 量測 S10469-20 1
2200 量測 S10469-10 1
2200 量測 S10469-01 2
2200 量測 H11124-01 1
2200 量測 A12180017 1
如果您環境是windows的環境,
可參考:
有關 Regular Expression 正則表達式 的粗淺資源介紹
裡的討論,有提到安裝Unix在windows環境的小工具,
就可執行上述提到的sed, awk/gawk, sort, uniq,
並把上述的指令碼中的單引號改成雙引號即可。
to twtw 您好 :
以上可否使用單一SQL指令show 出呢
因我是用asp.net + mysql ...
謝謝囉
twtw提到:
要用db來做字串的處理,
可能不是那麼方便,
看了hitomitanaka的解法,
才仔細看mysql的 String Functions 字串處理功能、
Control Flow Functions 控制流程,
就不需用外部程式來處理。