SQL Server:使用条件选择值

问题描述 投票:0回答:4

我有一个包含此示例数据的表格,其中

Id
productname
是列。我需要一个输出,当它与其他
Product1
具有相同的 Id 时返回
ProductNames
(请参阅下表的输出)。

身份证 产品名称
ABC123 产品1
ABC123 产品2
XYZ345 产品1
PQR123 产品1
MNP789 产品3
EFG456 产品1
EFG456 产品6
EFG456 产品7
JKL909 产品8
JKL909 产品8
JKL909 产品8
DBC778 产品9
DBC778 产品10

期望的输出:

身份证 产品名称
ABC123 产品1
ABC123 产品2
EFG456 产品1
EFG456 产品6
EFG456 产品7

基本上是和其他产品有

Product1
的时候按Id分组

我厌倦了以下查询,但没有给出预期的结果

select Id, ProductName 
from tbl1 
group by Id, ProductName 
having count(ProductName) > 1

提前致谢

sql-server group-by having
4个回答
0
投票

我认为,你最好在没有的情况下对桌子进行分组。查询将如下所示:

select * 
from tbl1 
group by Id, ProductName

希望这能解决你的问题


0
投票

以下是完成任务的一种方法。

DISTINCT
不是您的样本数据所必需的,但在存在重复的情况下需要,这可能基于其他产品的样本数据。

SELECT DISTINCT Id, ProductName
FROM @Product
WHERE Id IN(
    SELECT Id
    FROM @Product
    WHERE ProductName = 'Product1'
    )
    AND Id IN(
    SELECT Id
    FROM @Product
    WHERE ProductName <> 'Product1'
    )
ORDER BY Id, ProductName;

0
投票

使用

COUNT(*) OVER (PARTITION BY Id)
会给你
HAVING
-like functionality.

WITH cte AS (
    SELECT Id,
           ProductName,
           NumProductsForId = COUNT(*) OVER (PARTITION BY Id),
           DoesIdContainDesiredProductName = MAX(CASE WHEN ProductName = 'Product1' THEN 1 END) OVER (PARTITION BY Id)
    FROM tbl1
)
SELECT Id, ProductName
FROM cte
WHERE NumProductsForId > 1
  AND DoesIdContainDesiredProductName = 1;

0
投票

两个典型的选项是:

select * from T
where exists (
    select 1 from T t2
    where t2.Id = t.Id and t2.ProductName <> t.ProductName
);

with data as (
    select *, count(*) over (partition by Id) as cnt
    from T
)
select * from data where cnt > 1;
© www.soinside.com 2019 - 2024. All rights reserved.