2014-02-27 60 views
0

我必须从我的表中获取特定的输出格式。我需要一个特定的输出

比方说,我有一个简单的表2列名称

T1

+---------------+------------------+ 
| Name   | Value   | 
+---------------+------------------+ 
| stuff1  | 1    | 
| stuff1  | 1    | 
| stuff2  | 2    | 
| stuff3  | 1    | 
| stuff2  | 4    | 
| stuff2  | 2    | 
| stuff3  | 4    | 
+---------------+------------------+ 

我知道的值是在间隔1-4。 I组是由名称和值并计算相同的行数为,并得到如下表:

T2

+---------------+------------------+--------+ 
| Name   | Value   | Number | 
+---------------+------------------+--------+ 
| stuff1  | 1    | 2  | 
| stuff2  | 2    | 2  | 
| stuff3  | 1    | 1  | 
| stuff3  | 4    | 1  | 
+---------------+------------------+--------+ 

下面是当我需要你的帮助的一部分!如果我想获得这些格式,我应该怎么做?

T3

+---------------+------------------+--------+ 
| Name   | Value   | Number | 
+---------------+------------------+--------+ 
| stuff1  | 1    | 2  | 
| stuff1  | 2    | 0  | 
| stuff1  | 3    | 0  | 
| stuff1  | 4    | 0  | 
| stuff2  | 1    | 0  | 
| stuff2  | 2    | 2  | 
| stuff2  | 3    | 0  | 
| stuff2  | 4    | 0  | 
| stuff3  | 1    | 1  | 
| stuff3  | 2    | 0  | 
| stuff3  | 3    | 0  | 
| stuff3  | 4    | 1  | 
+---------------+------------------+--------+ 

感谢您的任何建议!

+0

我收回我的答案,因为它给出了错误的卡尔 – Owen

回答

3

开始时你有cross join生成所有可能的组合,然后在结果从现有查询左连接:在主题

select n.name, v.value, coalesce(nv.cnt, 0) as "Number" 
from (select distinct name from table t) n cross join 
    (select distinct value from table t) v left outer join 
    (select name, value, count(*) as cnt 
     from table t 
     group by name, value 
    ) nv 
    on nv.name = n.name and nv.value = v.value; 
+0

人指出,感谢你,感谢你的帮助! – ChangeTheWay

2

变化。

Gordon Linoff和Owen现有答案的区别。

  1. 我更喜欢使用GROUP BY来获取名称而不是DISTINCT。在这种情况下,这可能会有更好的表现。 (请参阅Rob Farley's still relevant article。)
  2. 为了清楚起见,我将子查询分解为一系列CTE。
  3. 我使用表T2作为问题现在标记组结果集,而不是显示为子查询。

    WITH PossibleValue AS (
        SELECT 1 Value 
        UNION ALL 
        SELECT Value + 1 
    FROM PossibleValue 
        WHERE Value < 4 
    ), 
    Name AS (
        SELECT Name 
        FROM T1 
        GROUP BY Name 
    ), 
    NameValue AS (
        SELECT Name 
         ,Value 
        FROM Name 
         CROSS JOIN 
         PossibleValue 
    ) 
    SELECT nv.Name 
         ,nv.Value 
         ,ISNULL(T2.Number,0) Number 
        FROM NameValue nv 
         LEFT JOIN 
         T2 ON nv.Name = T2.Name 
         AND nv.Value = T2.Value 
    
+0

我无法让我的SQL显示格式化为具有适当换行符的代码。当我尝试编辑它时,在编辑器中看起来很正确,但在预览中看不到。这对我来说是新的。 –

1

又一解决方案,这一次使用的表值构造的CTE建立名称值组合的表。

WITH value AS 
(SELECT DISTINCT t.name, v.value 
    FROM T1 AS t 
    CROSS JOIN (VALUES (1),(2),(3),(4)) AS v (value) 
) 
    SELECT v.name AS 'Name', v.value AS 'Value', COUNT(t.name) AS 'Number' 
    FROM value AS v 
    LEFT JOIN T1 AS t ON t.value = v.value AND t.name = v.name 
GROUP BY v.name, v.value, t.name;