SQL:如何在ssms中将值排序为类别

时间:2018-06-13 12:17:39

标签: sql sql-server ssms

我创建了查询

SELECT Dt, CustomerName, ItemRelation, SaleCount, 
              DocumentNum, DocumentYear, IsPromo, CustomerType
              FROM [dbo].[promo_data]  where [CustomerType]='XY'

库存数据[IsPromo](0-无库存,1是库存) 如何仅选择CustomerType的这些obs XY 对于动作类别只有一个值1 = 1

简单的例子

[ItemRelation]  [SaleCount] IsPromo ,[DocumentNum]  [DocumentYear]
11203   8,85947691  0   138 2018
11203   9,450108704 0   138 2018
11203   12,40326767 1   138 2018
11202   8,85947691  0   137 2018
11202   9,450108704 0   137 2018
11202   12,40326767 1   137 2018
11202   25,98779894 1   137 2018
11202   63,19760196 1   137 2018

我必须选择

11203       1   138 2018

,因为

11202       137 2018

有两个

2 个答案:

答案 0 :(得分:2)

你似乎想要:

SELECT ItemRelation, DocumentNum, DocumentYear, IsPromo
FROM [dbo].[promo_data]
WHERE CustomerType = 'XY' AND IsPromo = 1
GROUP BY ItemRelation, DocumentNum, DocumentYear, IsPromo
HAVING COUNT(*) = 1;

编辑:

要检索所有列,请使用窗口函数:

SELECT *
FROM (SELECT pd.*,
             COUNT(*) OVER (PARTITION BY ItemRelation, DocumentNum, DocumentYear, IsPromo) as cnt
      FROM [dbo].[promo_data] pd
      WHERE CustomerType = 'XY' AND IsPromo = 1
     ) pd
WHERE cnt = 1;

答案 1 :(得分:1)

根据Gordon的回答,如果要选择分组中未使用的其他字段,可以使用子查询进行自联接,如下所示:

SELECT pd.Dt, pd.CustomerName, pd.ItemRelation, pd.SaleCount, 
              pd.DocumentNum, pd.DocumentYear, pd.IsPromo, pd.CustomerType 
FROM [dbo].[promo_data] pd
INNER JOIN(
  SELECT ItemRelation, DocumentNum, DocumentYear, IsPromo
  FROM [dbo].[promo_data]
  WHERE CustomerType = 'XY' AND IsPromo = 1
  GROUP BY ItemRelation, DocumentNum, DocumentYear, IsPromo
  HAVING COUNT(*) = 1
) grouped
ON pd.ItemRelation = grouped.ItemRelation
AND pd.DocumentNum = grouped.DocumentNum
AND pd.DocumentYear = grouped.DocumentYear
AND pd.IsPromo = grouped.IsPromo