iT邦幫忙

0

請問SQL IF 判斷式的問題, 感嗯嗯嗯

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 是否可以做到呢 ,煩請各位先進幫忙 ,超感謝

2 個回答

8
一級屠豬士
iT邦高手 1 級 ‧ 2011-03-15 14:02:16
最佳解答
<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 |
+-----------+----------+
sundayjoe iT邦新手 5 級 ‧ 2011-03-15 14:26:31 檢舉

to hitomitanaka
經使用正確了 , 真超感謝你的....
現在知道select 可以用else , 真學到一招了..
感嗯囉

4
逮丸逮丸
iT邦大師 1 級 ‧ 2011-03-15 13:53:28

要用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,
並把上述的指令碼中的單引號改成雙引號即可。

sundayjoe iT邦新手 5 級 ‧ 2011-03-15 14:00:12 檢舉

to twtw 您好 :
以上可否使用單一SQL指令show 出呢
因我是用asp.net + mysql ...
謝謝囉

twtw提到:
要用db來做字串的處理,
可能不是那麼方便,

看了hitomitanaka的解法,
才仔細看mysql的 String Functions 字串處理功能、
Control Flow Functions 控制流程,
就不需用外部程式來處理。

我要發表回答

立即登入回答