需要协助从多个表执行数据透视

时间:2014-07-11 18:25:55

标签: sql sql-server

我在前言中说我是SQL的新手,并且由于Stack Overflow而一直在学习这个工作。

我正在运行多个表中的查询(总共3个),我试图在一行中获取每个唯一标识符的结果。其中一个表项有多个返回,我可以将它写入它们在自己的列中显示为max命令的位置;但是,它仍会为同一标识符返回多行。

这是我到目前为止所拥有的:

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

如果ID相同,我希望CustomCol1和CustomCol2的结果共享同一行。这可能吗?

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

这可以防止您看到的重复。如果你的最终目标是别的,那么,给我们一些更多信息,我相信有人会得到一个好的答案。