Sql 使用自连接检索唯一列

Sql 使用自连接检索唯一列,sql,Sql,有人能帮我解决下面的问题吗 表1: MSISDN(PK) product_name BASE_SOCBoo PLAN_NAME Limit 1 152 WHOADJTH2 N ABC 10 2 152 WADADJTH5 N ABC 20 2 152 THRWS33 Y ABC 100

有人能帮我解决下面的问题吗

表1:

  MSISDN(PK) product_name  BASE_SOCBoo  PLAN_NAME   Limit

1   152     WHOADJTH2          N           ABC         10
2   152     WADADJTH5          N           ABC         20
2   152     THRWS33            Y           ABC        100
3   149     WADADJTH4          N           ABC          5
4   149     WADADJTH5          N           ABC          6
我试图为msisdn显示必须的产品名称,如(whoadjth2、whoadjth5、whoadjth4),并且产品名称THRWS31、THRWS32、THRWS33是可选的,当这些存在时,基本soc\u boo标志显示为已启用,否则为“N”

当我尝试下面的sql时,我得到的输出非常接近

SELECT flex.msisdn,
  flex.product_name Flex_Soc,
  CASE
    WHEN base.product_name IN ('THRWS33', 'THRWS32', 'THRWS31')
    AND base.base_soc_boo   = 'Y'
    THEN base.product_name
    WHEN flex.product_name NOT IN ('THRWS33', 'THRWS32', 'THRWS31')
    AND flex.base_soc_boo       = 'N'
    THEN 'Not Prov'
  END base_soc,
  flex.plan_name,
  flex.limit
FROM table1,
  (SELECT b.product_name,
    b.plan_name,
    b.msisdn,
    b.base_soc_boo
  FROM table1 b
  WHERE product_name IN ('THRWS33', 'THRWS32', 'THRWS31')
  AND b.base_soc_boo IN ('Y')
  )base
WHERE flex.product_name <> base.product_name
AND flex.plan_name       = base.plan_name
AND flex.base_soc_boo   IN ('N','Y')

对于基本soc boo标志为“N”的149,需要显示为“未配置”

您的查询似乎过于复杂。在大多数数据库中,您可以为此使用窗口函数:

SELECT msisdn, flex_soc,
       coalesce(base_soc, 'Not Prov') as base_soc, plan_name, limit
from (SELECT flex.msisdn, flex.product_name as Flex_Soc,
             MAX(case when base_soc_boo = 'Y' then flex.product_name end) over
                 (partition by flex.msisdn) as base_soc,
            flex.plan_name, flex.limit
      FROM table1 flex
     ) flex
where base_soc_boo = 'N';
您没有指定数据库,因此ANSI兼容的语法似乎是合理的

+----+--------+-----------+----------+-----------+-------+
|    | MSISDN | FLEX_SOC  | BASE_SOC | PLAN_NAME | Limit |
+----+--------+-----------+----------+-----------+-------+
|  6 |    152 | THRWS33   | THRWS33  | ABC       | 10240 |
|  7 |    152 | WADADJTH5 | THRWS33  | ABC       |  4092 |
|  8 |    152 | WHOADJTH2 | THRWS33  | ABC       |  1024 |
|  9 |    149 | WADADJTH4 | Not Prov | ABC       |   512 |
| 10 |    149 | WADADJTH5 | Not Prov | ABC       |  1024 |
+----+--------+-----------+----------+-----------+-------+

这些奇怪的名字很难读懂。表1真的很灵活吗?否则,表模式在哪里起作用?在from子句中,我看不到“FLEX”表。那么期望的输出是什么样子的呢?是的,表1是flex。它的打字错误应该是这样的表1 flexI猜测我需要看到预期的输出我正在与你想要的东西斗争。我想当没有相同msidn的基本Soc boo为“Y”且产品在('THRWS33'、'THRWS32'、'THRWS31')中的记录时,您希望基本Soc说'Not Prov',因此在本例中,149两个记录的基本Soc都是'Not Prov',或者您希望第三个149记录说Not Prov…没错,您的理解是正确的,谢谢它正在工作,但我在输出中看到了多余的一行,(6),这不是预期的。您能帮我解决一下吗,因为我是sql新手。为什么会出现多余的一行。THRWS33在flex_soc中显示,不应该是。您能帮我解决一下输出应该只有7、8、9、10行吗only@RockStar . . . 我省略了最后的
where
子句。很奇怪,因为我专门使用了一个子查询来放入该子句,但我忘了添加它。非常感谢,它现在工作正常。添加where子句后。。再次感谢。。
+----+--------+-----------+----------+-----------+-------+
|    | MSISDN | FLEX_SOC  | BASE_SOC | PLAN_NAME | Limit |
+----+--------+-----------+----------+-----------+-------+
|  6 |    152 | THRWS33   | THRWS33  | ABC       | 10240 |
|  7 |    152 | WADADJTH5 | THRWS33  | ABC       |  4092 |
|  8 |    152 | WHOADJTH2 | THRWS33  | ABC       |  1024 |
|  9 |    149 | WADADJTH4 | Not Prov | ABC       |   512 |
| 10 |    149 | WADADJTH5 | Not Prov | ABC       |  1024 |
+----+--------+-----------+----------+-----------+-------+