Tsql 从第一个表中排除值的并集

Tsql 从第一个表中排除值的并集,tsql,sql-server-2008-r2,birt,Tsql,Sql Server 2008 R2,Birt,我试图解决的最初问题是,我需要显示特定“连接”表中的所有行。然而,这些数据有时是空白的,没有总计,通常不会显示(考虑每个类别和计数) 因此,我试图做的是合并到一个“0值”数据集,以显示所有类别。但是,当我进行联合时,它会显示一个0值行,以及正常数据。下面是一个例子 SELECT category_name, COUNT(files_number) FROM files LEFT JOIN categories ON categories.category_id = files.category_

我试图解决的最初问题是,我需要显示特定“连接”表中的所有行。然而,这些数据有时是空白的,没有总计,通常不会显示(考虑每个类别和计数)

因此,我试图做的是合并到一个“0值”数据集,以显示所有类别。但是,当我进行联合时,它会显示一个0值行,以及正常数据。下面是一个例子

SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id

UNION 

SELECT category_name, 0
FROM categories
这将为我提供一个类似以下内容的结果集:

category_name | value
----------------------
open file     | 0
open file     | 23
closed file   | 0

有没有办法删除重复的零值项?请不要在实际查询中使用复杂的WHERE子句,因此最好避免重复使用该子句。

我不明白为什么要使用left join和union

您可以执行以下操作来删除重复项、包装查询和分组

;with cte
as
(
SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id
UNION 
SELECT category_name, 0
FROM categories
)
select categoryname,sum(aggcol)
from cte
group by 
category

我不明白你为什么要做左联

您可以执行以下操作来删除重复项、包装查询和分组

;with cte
as
(
SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id
UNION 
SELECT category_name, 0
FROM categories
)
select categoryname,sum(aggcol)
from cte
group by 
category

一种方法是从categories(类别)表中选择所有类别,然后左键连接到文件计数(按类别\ id分组)

编辑 如果要反转查询,可以这样做,使用右外部联接-这样无论是否有任何文件,都会返回categories表中的每个类别:

SELECT c.category_name, COUNT(f.category_id) AS FileCount
FROM files f
    RIGHT JOIN categories c ON c.category_id = f.category_id
GROUP BY c.name

一种方法是从categories(类别)表中选择所有类别,然后左键连接到文件计数(按类别\ id分组)

编辑 如果要反转查询,可以这样做,使用右外部联接-这样无论是否有任何文件,都会返回categories表中的每个类别:

SELECT c.category_name, COUNT(f.category_id) AS FileCount
FROM files f
    RIGHT JOIN categories c ON c.category_id = f.category_id
GROUP BY c.name

我不确定这对您的示例是否重要-但查询(我不想重写,因为它又大又复杂)是反向的-例如,选择文件、连接类别。我还在这个查询上运行多个sum/avg/count。您认为它是否仍然适用于建议的修复方案?我不确定这对您的示例是否重要-但查询(我不想重写,因为它又大又复杂)是反向的-例如,选择文件、加入类别。我还在这个查询上运行多个sum/avg/count。您认为它仍然可以使用建议的修复程序吗?我在最初的问题中忘记了这一点-但是我面临一些限制,因为这是使用BIRT实现的。因此,我的“正确”答案可能反映了BIRT设置的这些限制。我在原始问题中忘记了这一点-但我面临一些限制,因为这是使用BIRT实现的。因此,对我来说“正确”的答案可能反映了BIRT设置的这些限制。我不得不对此稍作修改(因为我的工具-BIRT-不允许我在SQL Server中完成所有操作。但是,它似乎可以工作,并使我不必更改任何查询。进一步研究它,但这可能会工作(或多或少)。我不得不对此做一点小小的修改(因为我的工具BIRT不允许我在SQL Server中完成所有操作。但是,它似乎可以工作,并使我不必更改任何查询。请进一步研究它,但这可能会工作(或多或少)。