2014-07-11 70 views
0

我的前言說我是SQL的新手,並且由於堆棧溢出而在工作中學習。需要幫助執行從多個表的數據透視表

我正在運行從多個表(共3)查詢,我試圖獲得每行唯一標識符的結果。 1個表項有多個返回值,我可以將它寫到它們自己的列中作爲最大命令顯示的位置;但是,它仍然爲相同的標識符返回多行。

這是我到目前爲止有:

SELECT tbl.1.field as ID, tbl.2.field as Name, tbl.2.fieldb as Product, 
COUNT(*) AS ConfirmedSales 
MAX(CASE WHEN tbl.3.field = 'Product1' then 1 else 0 end) as CustomCol1 
MAX(CASE WHEN tbl.3.field = 'Product2' then 1 else 0 end) as CustomCol2 
FROM tbl.2 
LEFT JOIN tbl.2 on tbl.2.x = tbl.1.x 
INNER JOIN tbl.3 on tbl.2.x = tbl.3.x 
WHERE ((tbl.1.date between '01/01/2014 00:00:00' and 06/30/2014 23:59:59')) 
GROUP BY tbl.1.field, tbl.2.field, tbl.2.fieldb 

返回結果如下:

Row |ID |Name   |CustomCol1 |CustomCol2 
1  |8048 |Jon Smith |1   |0 
2  |8048 |Jon Smith |0   |1 
3  |4044 |Max Williams |0   |0 

我想對於結果CustomCol1和CustomCol2共享同一行,如果該ID是相同。這可能嗎?

+0

除了COUNT(*)和MAX()字段之間缺少逗號的語法錯誤,並且您的「tbl.1」等表名引用示例試圖隱藏數據庫名稱,它應該可以工作,但不是顯示您的設置中的計數(*)列結果。 – DRapp

+0

這兩個自定義列的1和0是什麼意思?如果有更好的方法來給你你需要的東西,我只是好奇而已。 –

回答

0

考慮你的情況下,移動到一個子查詢,像這樣:

SELECT t.ID, t.name, MAX(s.custom1) AS custom1, MAX(custom2) AS custom2 
FROM #tbl1 t 
    INNER JOIN (SELECT personID 
        ,CASE WHEN s.product = 'product1' THEN 1 ELSE 0 END custom1 
        ,CASE WHEN s.product = 'product2' THEN 1 ELSE 0 END custom2 
       FROM #sales s) s ON t.ID = s.personID 
GROUP BY t.ID, t.Name 

這會防止你所看到的重複。如果你的最終目標是別的,但是,給我們更多的信息,我相信有人會有一個很好的答案。