【问题标题】:SQL: For the same value of A, if two or more values of B exist, and one of the B values is null; show all combinations of A, B and C [closed]SQL:对于A的同一个值,如果B的值存在两个或多个,且B值之一为null;显示 A、B 和 C 的所有组合 [关闭]
【发布时间】:2018-03-20 08:01:37
【问题描述】:

寻找如何在 SQL 中解决这个问题。

对于A的同一个值,如果B的值存在两个或多个,且B值之一为null;显示 A、B 和 C 的所有组合。

表:

A   B   C  
1   2   3 
4   5   6  
7   8   9  
1  null 4
1   2   4
9   3   5
9  null 7

预期结果:

A   B   C 
1   2   3
1  null 4
1   2   4
9   3   5
9  null 7

谢谢你:)

更好的例子

【问题讨论】:

标签: mysql sql sqlite


【解决方案1】:

您的要求有点棘手。一种说法是,为了被保留,A 组必须有一个不同的B 计数加上一个可选的增量,用于存在两个或更多的空值。

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT A
    FROM yourTable
    GROUP BY A
    HAVING
        COUNT(DISTINCT B) > 0 AND
        MAX(CASE WHEN B IS NULL THEN 1 ELSE 0 END) > 0
) t2
    ON t1.A = t2.A;

Demo

该演示适用于 MySQL,但碰巧同样的查询也应该在 SQLite 上运行。

【讨论】:

  • 嗨蒂姆。我在我的问题中添加了一张图片。希望现在更清楚了。你能看一下吗?
  • @Rex 你的问题我从来都不清楚。
  • 这还将返回一个包含两个不同值但不存在 NULL 的组,即示例中的 VODAFONE 组。
  • @dnoeth 我误读了这个问题,认为 OP 想要 2 个或更多非 NULL B 值或 NULL 值,后者只计算一次。
  • COUNT(DISTINCT B) > 0 = COUNT(B) > 0
【解决方案2】:

这应该会返回您的预期结果,只需比较 allNOT NULL 行的计数:

基于Tim's fiddle:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT A
    FROM yourTable
    GROUP BY A
    HAVING COUNT(*) > COUNT(B)
       AND COUNT(*) > 1
) t2
    ON t1.A = t2.A;

或者作为一个简单的子查询:

SELECT *
FROM yourTable
WHERE A IN
 (
   SELECT A
   FROM yourTable
   GROUP BY A
   HAVING COUNT(*) > COUNT(B)
      AND COUNT(*) > 1
 )

fiddle

【讨论】:

    【解决方案3】:

    另一个解决方案:

    SELECT t1.*
    FROM #testdata t1
    WHERE EXISTS (SELECT * FROM #testdata WHERE A = t1.A AND B IS NULL)
    AND   EXISTS (SELECT * FROM #testdata WHERE A = t1.A AND B IS NOT NULL)
    

    SQL Fiddle

    【讨论】:

      【解决方案4】:

      基于示例,您只需要简单的group by 子句和join 它们

      select * from table t
      inner join (
           select provider from table t
           group by provider 
           having count(*) > 1 and 
                  sum(case when service is null then 1 else 0 END) >= 1
      ) c on c.provider  = t.provider 
      

      【讨论】:

      • @TimBiegeleisen.. 我不知道你在 20 分钟之前写了什么查询,如果相同,请告诉我删除这篇文章或发布不同的内容。
      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多