Re: [SQL ] 請問這個選擇語法
※ 引述《vizshala (Mein Gott!!)》之銘言:
: 假設有table資料如下
: tb1
: ---------------------------------------------------
: 帳號 訂購編號 日期
: ---------------------------------------------------
: User Item OrderDate
: ---------------------------------------------------
: User1 Item0 2008-10-10 10:00:00
: User1 Item1 2008-10-10 10:00:00
: User2 Item0 2008-10-10 10:00:00
: User2 Item0 2008-10-10 10:00:00
: User2 Item1 2008-10-10 10:00:00
: User3 Item1 2008-10-10 10:00:00
: User3 Item2 2008-10-10 10:00:00
: User4 Item3 2008-10-10 10:00:00
: User5 Item0 2008-10-10 10:00:00
: User5 Item0 2008-10-10 10:00:00
: User5 Item1 2008-10-10 10:00:00
: 要怎麼產生各個User對應的Item數目報表,想要統計各個User訂購的項目
: Item0 Item1 Item2 Item3
: User1 1 1
: User2 2 1
: User3 1 1
: User4 1
: User5 2 1
: 請問語法該怎麼下,使用MS-SQL
: 如果使用
: Select User, count(item) from tb1 只能獲得該使用者全部的訂購數
: 該如何產生各個項目的統計呢
: 剛剛試了一下
: select User,
: sum(i0) as count_i0,
: sum(i1) as count_i1,
: sum(i2) as count_i2,
: sum(i3) as count_i3 from
: (
: select User,
: case Item
: when 0 then count(Item)
: else 0
: end as i0,
: case Item
: when 1 then count(Item)
: else 0
: end as i1,
: case Item
: when 2 then count(Item)
: else 0
: end as i2,
: case Item
: when 3 then count(Item)
: else 0
: end as i3,
^這個會錯吧?
: from tb1 group by User
: ) as list_1
: group by User
: 可以產生想要的結果,不過語法似乎不夠簡潔,效能可能也有問題
語法要簡潔可以查詢 PIVOT的用法…SQL SERVER 2005之後才有的樣子;
現在沒說怎麼用是因為…我忘記怎麼用了XD
我覺得 PIVOT的用法不合我的直覺,也不一定比較快,
所以不常用,但 SQL寫完確實會比較短。
往回看了幾篇文章,直的(資料列)要轉橫(欄位)的通常都可以使用sum(case...)
效能嘛…多想幾種寫法,然後實驗吧!變因似乎不少…提供另一種
select User,
SUM(case Item
when 0 then 1
else 0
end) as i0,
SUM(case Item
when 1 then 1
else 0
end) as i1,
SUM(case Item
when 2 then 1
else 0
end) as i2,
SUM(case Item
when 3 then 1
else 0
end) as i3
from tb1 group by User
大概是這樣,可以少一個 group by,不確定能否直接用,看懂再試著改看看
也不確定會不會比較快
: 想請問是否有更好的作法
: 謝謝
: ※ 編輯: vizshala 來自: 59.124.66.91 (10/21 14:33)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.206.51
※ 編輯: grence 來自: 61.229.206.51 (10/21 22:07)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):