2016-09-15 77 views
0

在这寻找一些帮助。让我的数据集有3列:类别,子类别和值。SQL将行添加到我的数据集中作为缺失组的占位符?

每个类别并不包含所有的子类别,如果没有,我想添加一个新的行/占位符失踪类别/子类别结合的0

的值。例如:

SELECT distinct(SubCategory) From MyTable returns: 
SubCategory-A 
SubCategory-B 
SubCategory-C 
SubCategory-D 

假设组别包含子类别-A和子类别-C。我想添加占位符/新行失踪的子类B和d,所以最终我的结果会是什么样子(顺序并不重要):

Category1  SubCategory-A  100 
Category1  SubCategory-C  125 
Category1  SubCategory-B  0  << new row/placeholder 
Category1  SubCategory-D  0  << new row/placeholder 

我有多个分类,我想这适用于。谁能帮我这个?非常感激!

+0

“可以说我的每张桌子都有3列”请问您可以为您的桌子命名并详细说明它的结构吗? – Catzeye

+0

你想要一个'FULL OUTER JOIN'和'COALESCE'掉'NULL' 0 – scsimon

+0

嘿,感谢您的答复。我更新了上面的陈述。打算读1个表格,或1个数据集,只有3列。 – Jay

回答

1

尝试了这一点:

首先插入所有不同的categoryId和目标表

SELECT DISTINCT CategoryIds, SubCategoryIds into #t1 FROM TableC 

然后subcategoryid到一个临时表值插入到目标表

INSERT INTO TableC(CategoryIds, SubCategoryIds,Value) 
SELECT CategoryIds, SubCategoryIds,0 FROM 
(SELECT Distinct CategoryIds From TableA) A 
CROSS JOIN (SELECT Distinct SubCategoryIds From TableA) B 
EXCEPT 
SELECT CategoryIds, SubCategoryIds, 0 FROM #t1 
+0

感谢所有的答复,我敢肯定,所有/许多答复都能奏效。我只是想使用这个变体来获得我正在寻找的东西。再次感谢 – Jay

0

这里的另一个版。

的你去会受到影响,如果你的表是大的(但只有当它能够以MB为单位的100S来衡量,我猜)版本为准表现

;WITH cteGaps as (
    select 
     cat.Category 
     ,subcat.SubCategory 
    from (-- All categories 
      select distinct Category 
      from MyTable 
     ) cat 
     cross join (-- All subcategories 
        select distinct SubCategory 
        from MyTable 
       ) subcat 
    except select 
     Category 
     ,SubCategory 
    from MyTable 
    ) 
INSERT MyTable (Category, SubCategory, Value) 
select Category, SubCategory, 0 
    from cteGaps 
0

这是我会使用。与其他人类似,但在我的脑海中,阅读和理解起来更容易一些。也避免使用CTE,我认为这是不必要的。在大多数情况下,我更喜欢group by而不是distinct,但是,再次,只是个人偏好。

SELECT a.*, Value = ISNULL(b.Value, 0) 
FROM ( -- returns all pairs of category and subcategory 
    SELECT * 
    FROM (
     SELECT Category 
     FROM MyTable 
     GROUP BY Category 
    ) a 
    CROSS JOIN (
     SELECT SubCategory 
     FROM MyTable 
     GROUP BY SubCategory 
    ) b 
) a 
LEFT JOIN MyTable b 
ON a.Category = b.Category and a.SubCategory = b.SubCategory 

别名的子查询,但是你想 - 我是懒惰和使用ab

0

试试这个;

SELECT a.Category,c.SubCategory,ISNULL(b.Value,0) AS Value 
FROM MyTable a 
CROSS JOIN Mytable c 
LEFT JOIN MyTable b 
On c.SubCategory = b.SubCategory 
AND a.category = b.Category 
GROUP BY a.Category,c.SubCategory,b.Value