SQL联接—标识缺少的行

SQL联接—标识缺少的行,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我需要找到所有带有特定标记的行,这些行没有带有不同标记的对应行 我的表格结构如下: Year, Week, Brand, Country, LoactionCode, ProductCategory, VolumeType, Division, Activity, Tag, Qty 一些数据样本: 2016,1,Dell, USA, 100, Computers, Accessories, Retail, Pricing, 'CF',800 2016,1,Dell, USA, 100, C

我需要找到所有带有特定标记的行,这些行没有带有不同标记的对应行

我的表格结构如下:

Year, Week, Brand, Country, LoactionCode, ProductCategory, VolumeType, Division, Activity, Tag, Qty
一些数据样本:

 2016,1,Dell, USA, 100, Computers, Accessories, Retail, Pricing, 'CF',800
 2016,1,Dell, USA, 100, Computers, Accessories, Retail, Tagging, 'CF',1500
 2016,1,Dell, USA, 100, Computers, Accessories, Retail, Pricing, 'OF',1000
 2016,1,Dell, USA, 100, Computers, Accessories, Retail, Tagging, 'OF',1200
 2016,1,Dell, USA, 100, Computers, Accessories, Retail, Bagging, 'OF',1200
我想获取标记为“of”的行,但在所有字段“年、周、品牌、国家、LoactionCode、ProductCategory、VolumeType、部门、活动”上没有标记为“CF”的对应行


有人能帮我吗?

你可以使用having子句:

SELECT t.year,t.week,t.brand.....t.tag,sum(t.qty?)
FROM YourTable t
GROUP BY t.year,t.week,t.brand.....
HAVING count(CASE WHEN t.tag = 'OF' then 1 end) > 0
   AND count(CASE WHEN t.tag = 'CF' then 1 end) = 0

我不知道当有超过1行的标记为“OF”时,您想对qty字段做什么,您可以将其从sum更改为max或其他任何要求。

我已将您的示例数据更改为一些合理的测试数据:

  • 共有3行,标记=OF
  • 一个匹配的CF行
  • 还有一个不匹配
  • 因此,最终结果集中应包含2行
查询使用CTE生成样本数据。
该解决方案使用常规查询来选择您可能感兴趣的行数,然后是一个查询,该查询定义了您希望从上一个结果集中排除的行

;with SampleData AS (
    SELECT  2016 as Year, 1 AS Week, 'Dell' AS Brand, 'CF' AS Tag, 800 AS Qty
    UNION ALL SELECT 2016, 1, 'AMD', 'CF', 1500
    UNION ALL SELECT 2016, 1, 'Intel', 'OF', 1000
    UNION ALL SELECT 2016, 1, 'Apple', 'OF', 1200
    UNION ALL SELECT 2016, 1, 'Dell', 'OF', 1200
)
--Solution uses CTE from above
SELECT  Year, Week, Brand
FROM    SampleData
WHERE   Tag = 'OF'
EXCEPT
SELECT  Year, Week, Brand
FROM    SampleData
WHERE   Tag = 'CF'

从表t group by t中选择t.tag,count(*)。tag给了我:CF 329108/310024,但通过上面的查询,我得到的差异计数仅为4056。理想情况下,它应该是CF-of中总行数的差异。(组合的所有行都是唯一的)@Jinith请用数据示例和预期输出更新您的问题。@Jinith我不明白为什么这个查询不起作用。你确定没有重复的吗?使用
选择t.标记、t.年、t.周。。。从表t中,t.标记('OF','CF')按t.标记分组,t.年,t.周。。。有COUNT(*)>1
要检查。@Craigyong很抱歉耽搁了。。我们有大约6000万行需要验证,所以花了一段时间,发现存在数据问题,因此我不确定查询是否有效。谢谢大家。