【问题标题】:Select rows with same value in one column but different value in another column选择一列中具有相同值但在另一列中具有不同值的行
【发布时间】:2017-02-14 09:59:01
【问题描述】:

我一直在尝试构建此查询,但对 SQL 不熟悉,因此非常感谢一些帮助。

在下表示例中,我有一个客户代码、一个链接的客户代码(用于将子客户链接到父客户)、销售人员和其他不相关的列。目标是为每个父客户及其子客户配备一名销售人员。因此,在示例中,CustCode #100 是其自身、#200、#500 和 #800 的父代。所有这些帐户都有相同的销售人员 (JASON),这是完美的。但对于 CustCode #300,它是其自身、#400 和 #600 的父代。但是,没有指定一名销售人员 - JIM 和 SUZY。我想构建一个显示此示例的所有帐户的查询。基本上,销售人员字段对于所有子客户的值都不相同的帐户。

我尝试了销售人员 销售人员的 Where 子句,但它没有正确显示。

+-----------+------+------------+------ ----------------+ |客户代码 |链接客户代码 |营业员|附加列...| +-----------+------+------------+------ ----------------+ | 100 | 100 |杰森 | ... | | 200 | 100 |杰森 | ... | | 300 | 300 |吉姆 | ... | | 400 | 300 |吉姆 | ... | | 500 | 100 |杰森 | ... | | 600 | 300 |苏西 | ... | | 700 |空 |吉姆 | ... | | 800 | 100 |杰森 | ... | +-----------+------+------------+------ ----------------+

非常感谢您的帮助!

【问题讨论】:

  • 那么,上面的数据表都在一个表中——你现在没有使用任何连接,对吧?您是否已经有任何示例 SQL 代码?如果您只想要 CustCode、Linked 和 Salesperson 的不同值,您应该可以使用 select distinct custcode,[linked custcode],salesperson from table
  • 发布一些示例输出
  • 嗨,这个问题解决了吗?您需要进一步的帮助吗?
  • 以上所有数据都在一个表中,因此不需要表连接。我只想看到分配了多个销售人员的关联客户。对于特定的父客户,如果将同一销售人员分配给所有子客户,那么我不想在查询中显示。
  • @Shnugo 哦,谢谢,我不知道。我不是在寻找计数。我希望不显示为所有帐户分配同一销售人员的行。基本上,我希望我的示例中链接的客户代码为 300 的行。所有链接的客户代码的销售人员代码都不相同的帐户。

标签: sql sql-server


【解决方案1】:

此解决方案首先使用递归 CTE 来构建层次结构并找到每一行的前导代码,即使链接代码指向的行本身也指向上一行。

最终查询显示不同销售人员的数量:

DECLARE @tbl TABLE(CustCode INT,[Linked CustCode] INT,Salesperson VARCHAR(100));
INSERT INTO @tbl VALUES
 (100,100,'JASON')
,(200,100,'JASON')
,(300,300,'JIM')
,(400,300,'JIM')
,(500,100,'JASON')
,(600,300,'SUZY')
,(700,NULL,'JIM')
,(800,100,'JASON');

--查询

WITH CleanUp AS
(
    SELECT CustCode 
          ,CASE WHEN [Linked CustCode]=CustCode THEN NULL ELSE [Linked CustCode] END AS [Linked CustCode]
          ,Salesperson
    FROM @tbl
)
,recCTE AS
(
    SELECT CustCode AS LeadingCode,CustCode,[Linked CustCode],Salesperson
    FROM CleanUp
    WHERE [Linked CustCode] IS NULL

    UNION ALL

    SELECT recCTE.LeadingCode,t.CustCode,t.[Linked CustCode],t.Salesperson
    FROM recCTE
    INNER JOIN CleanUp AS t ON t.[Linked CustCode]=recCTE.CustCode
)
SELECT LeadingCode,COUNT(DISTINCT Salesperson) AS CountSalesperson
FROM recCTE
GROUP BY LeadingCode

结果

LeadingCode CountSalesperson
100         1
300         2
700         1

【讨论】:

    【解决方案2】:

    您可以在桌子上进行自连接。

    select distinct r2.* from 
    table r1 
    join table r2 
    on
    r1.linkedcustcode = r2.linkedcustcode and r1.salesperson <> r2.salesperson
    

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2012-05-25
      • 2015-07-17
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2022-07-18
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多