2012-08-30 60 views
1

下午好之一,行的列在SQL是列計數

我想使用CASE想在這個問題轉行列:在不過

Rows to columns SQL Server query

我案例我沒有一個列的信息,它是一個數據的計數。

我得到的數據與此查詢:查詢

select MA, SN, count(*) 
from Original 
where MA = 'AB' 
group by MA 

結果:

MA SN  COUNT 
AB TEXTA 6 
AB TEXTB 5 
AB TEXTC 3 
AB TEXTD 4 

表原件

MA SN  
AB TEXTA 
AB TEXTA 
AB TEXTA 
AB TEXTA 
AB TEXTA 
AB TEXTA 
. 
. 
. 
AB TEXTD 
AB TEXTD 

表結果:

MA  TEXTA TEXTB TEXTC TEXTD 
AB  6  5  3  4 

這是我當前的查詢:

select MA, 
     count(*) as 'COUNT2', 
    MAX(CASE WHEN SN = 'TEXTA' THEN COUNT2 end) as TEXTA1, 
    MAX(CASE WHEN SN = 'TEXTB' THEN COUNT2 end) as TEXTB1, 
    MAX(CASE WHEN SN = 'TEXTC' THEN COUNT2 end) as TEXTC1, 
    MAX(CASE WHEN SN = 'TEXTD' THEN COUNT2 end) as TEXTD1, 

from Original 
where MA= 'AB' 
group by MA 

我在做什麼在查詢可怕的錯誤?有人可以解釋爲什麼我發佈它的問題有效,但不是與伯爵?。謝謝! :)。

+1

什麼樣的SQL的? – podiluska

+1

這是微軟的SQL,我沒有看到我的查詢中的拼寫錯誤,我正在編寫爲COUNT2,然後在COUNT2的情況下。如果您引用表Original,則可以通過另一個查詢獲得,並且我可以編寫任何我想要的名稱。謝謝。 – Eduardo

+1

該問題的演示:http://www.sqlfiddle.com/#!3/0b577/2 – mellamokb

回答

4

編輯:您無法按照您的打算使用COUNT2,因爲選擇列表中的後面的列無法引用先前列的別名。因此COUNT2在查詢中的其他任何地方都沒有意義,除非您將該部分轉換爲子查詢(或cte),然後再引用它。

因此,使用更新後的模式,您需要一個子查詢來完成計數。從本質上講放下你的第一個查詢作爲一個子查詢的第二個查詢(以取代Original),然後添加一些失蹤group by列,然後它的工作原理:

select MA, 
    MAX(CASE WHEN SN = 'TEXTA' THEN COUNT2 end) as TEXTA1, 
    MAX(CASE WHEN SN = 'TEXTB' THEN COUNT2 end) as TEXTB1, 
    MAX(CASE WHEN SN = 'TEXTC' THEN COUNT2 end) as TEXTC1, 
    MAX(CASE WHEN SN = 'TEXTD' THEN COUNT2 end) as TEXTD1 
from (
    select MA, SN, count(*) as COUNT2 
    from Original 
    where MA = 'AB' 
    group by MA, SN 
) Original 
where MA= 'AB' 
group by MA 

http://www.sqlfiddle.com/#!3/41c79/7

+0

嗨,感謝您的答案,正如問題中提到的:「我沒有一個信息欄,它是一個數據計數」。我寫了一個示例查詢來獲取數據。這是我的問題和這一個之間的區別http://stackoverflow.com/questions/7534403/rows-to-columns-sql-server-query – Eduardo

+0

嗨@Eduardo:如果你看看[鏈接的演示](http: //www.sqlfiddle.com/#!3/0b577/10),您會發現它會將您的表'Original'轉換爲您在「Results」中獲得的預期輸出。你能解釋一下,如果這不是理想的結果嗎? – mellamokb

+0

嗨我檢查了查詢,你正在手動寫入值6,5,4和3,在我的情況下可以改變,因爲他們是計數操作的結果。該表原件應該是這樣的CREATE TABLE原始 \t( 'AB', 'TEXTA'), \t( 'AB', 'TEXTA'), \t( 'AB', 'TEXTA'), \t( 'AB', 'TEXTA'), \t( 'AB', 'TEXTA'), ( 'AB', 'TEXTA'), \t( 'AB', 'TEXTB'), \t( 'AB' 'TEXTB'), \t( 'AB', 'TEXTB'), \t( 'AB', 'TEXTB'), \t( 'AB', 'TEXTB'), \t( 'AB',' TEXTC'),('AB','TEXTC'), ('AB','TEXTC'), \t('AB','TEXTD'); ('AB','TEXTD'); ('AB','TEXTD'); ('AB','TEXTD'); – Eduardo