2012-04-25 29 views
3

我使用MS SQL 2008年我的表看起来像这样:如何做一个SQL自我与零点加入

| Name | Code | Amt | 
| ----- | ---- | ---- | 
| April | A | 1.23 | 
| Barry | A | 2.34 | 
| Barry | B | 3.45 | 
| Cliff | A | 4.56 | 
| Cliff | B | 5.67 | 
| Cliff | C | 6.78 | 

我需要的输出是这样的:

| Name | Code_A | Code_B | Code_C | 
| ----- | ------ | ------ | ------ | 
| April | 1.23 | NULL | NULL | 
| Barry | 2.34 | 3.45 | NULL | 
| Cliff | 4.56 | 5.67 | 6.78 | 

的空白可为零。

随着自我加入,我能够得到悬崖,但无法得到巴里和四月,因为我使用这样的事情,只有在所有三个条件都可用时才会输出。

SELECT  a.Name, a.Amt Code_A, b.Amt Code_B, c.Amt Code_C 
FROM  Table_1 as c INNER JOIN 
        Table_1 AS b ON c.Name = b.Name INNER JOIN 
        Table_1 AS a ON b.Name = a.Name 
WHERE  (a.Code = 'A') AND (b.Code = 'B') AND (c.Code = 'C') 
+0

听起来好像你想要一个外连接。 – Gabe 2012-04-25 16:26:12

回答

4

代替JOIN S,我觉得PIVOT是比较合适的位置:

SELECT 
    Name, 
    [A] AS Code_A, 
    [B] AS Code_B, 
    [C] AS Code_C 
FROM (
    SELECT Name, Code, Amount 
    FROM Table_1 
) t 
PIVOT (
    SUM(Amount) 
    FOR Code IN ([A], [B], [C]) 
) AS pvt 
+0

即将在工会解决方案上发布小组。这更干净。 +1 :) – JAQFrost 2012-04-25 16:40:32

+0

这按预期工作。谢谢! – Scott 2012-04-25 17:14:44

2

一个完全SQL引擎不可知论的方法是:

select names.Name, 
    (select sum(a2.Amt) from amounts a2 
    where a2.Name = names.Name 
     and a2.Code = 'A') as AmtA, 
    (select sum(a3.Amt) from amounts a3 
    where a3.Name = names.Name 
     and a3.Code = 'B') as AmtB, 
    (select sum(a4.Amt) from amounts a4 
    where a4.Name = names.Name 
     and Code = 'C') as AmtC 
from (select distinct Name from amounts) as names 

在其中选择一套独特的名称,然后总结每个特定代码的数量。这更像是指导SQL如何工作。

实际上,我不会在你的情况下实际使用它 - PIVOT对于任何支持它的引擎都会更有效率。如下所示:http://sqlfiddle.com/#!3/7cb0a/5

+0

感谢您提供SQL小提琴的链接。过去我使用过JSFiddle,我将来肯定会玩这个。 – Scott 2012-04-25 17:25:29