【问题标题】:Duplicate results - cannot condense重复结果 - 无法压缩
【发布时间】:2016-03-17 18:16:44
【问题描述】:

此报告的结果列出了同一个客户 7-9 次。我不完全确定为什么。尝试过 GROUPING 和 DISTINCT。 DISTINCT 将结果细化为每个客户端仅 3 个重复项。

也许我忽略了一些明显的东西。

简而言之,我得到了

客户 ID |名字 |姓氏

123.......约翰........................约翰

123.......约翰........................约翰

123.......约翰........................约翰

456.......................鲍勃......................鲍勃

456.......................鲍勃......................鲍勃

456.......................鲍勃......................鲍勃

我需要什么:

客户 ID |名字 |姓氏

123.......约翰........................约翰

456.......................鲍勃......................鲍勃

但是 GROUP BY 或 DISTINCT 不能解决问题。

SELECT  
     c.clientID
    ,c.firstName AS 'First_Name'
    ,c.lastName  AS 'Last_Name'
    ,c.homePhone AS 'Home'
    ,c.cellPhone AS 'Cell'
    ,NULL        AS '------'
    ,CASE
        WHEN ccf.name LIKE 'First Contact Date' THEN ccv.TextVal
     END         AS 'First_Contact_Date'
    ,CASE
        WHEN ccf.name LIKE 'Referral Date' THEN ccv.DateVal
     END         AS 'Referral_Date'
    ,CASE
        WHEN ccf.name LIKE 'Referred By' THEN ccv.TextVal
     END         AS 'Referred_By'
    ,CASE
        WHEN ccf.name LIKE 'Intake Date' THEN ccv.DateVal
     END         AS 'Intake_Date'
    ,CASE
        WHEN ccf.name LIKE 'Intake By' THEN ccv.TextVal
     END         AS 'Intake_By'
    ,CASE
        WHEN ccf.name LIKE 'Orientation Date' THEN ccv.TextVal
     END         AS 'Orientation_Date'
    ,CASE
        WHEN civ.clientIndexID = 5 THEN civ.clientIndexValueName
     END         AS 'Primary_Language'
    ,NULL        AS '------'
    ,CASE
        WHEN civ.clientIndexID = 18 THEN civ.clientIndexValueName
     END         AS 'Type'
    ,CASE
        WHEN civ.clientIndexID = 20 THEN civ.clientIndexValueName
     END         AS 'Stage_at_intro'
    ,CASE
        WHEN civ.clientIndexID = 21 THEN civ.clientIndexValueName
     END         AS 'Current_stage'
    ,NULL        AS '------'
    ,CASE
        WHEN civ.clientIndexID = 19 THEN civ.clientIndexValueName
     END         AS 'Percentage'
    ,CASE
        WHEN civ.clientIndexID = 26 THEN civ.clientIndexValueName
     END         AS 'Location'
    ,CASE
        WHEN civ.clientIndexID = 27 THEN civ.clientIndexValueName
     END         AS 'Eligible?'

FROM clients c
    INNER JOIN tblClientCustomValues ccv
        ON c.clientID = ccv.clientID
    INNER JOIN tblClientCustomFields ccf
        ON ccv.ID = ccf.ID
    INNER JOIN tblClientIndexData cid
        ON c.clientID = cid.clientID
    INNER JOIN tblClientIndexValue civ
        ON cid.clientIndexValueID = civ.clientIndexValueID
GROUP BY c.clientID
        ,c.firstName
        ,c.lastName
        ,c.homePhone
        ,c.cellPhone
        ,ccf.name
        ,ccv.TextVal
        ,ccv.DateVal
        ,civ.clientIndexValueName
        ,civ.clientIndexID

有关表格的更多信息:

tblClientCustomFields ccf:

ID |姓名 |类型ID

tblClientIndexData cid:

ClientIndexValueID |客户编号

tblClientIndexValue civ:

ClientIndexValueID |客户索引 ID |客户索引值名称

tblClientCustomValues ccv:

ID |客户ID |文本值 |日期值 |数值

【问题讨论】:

  • 您的 select 语句中的列比您说的 3 列要多得多。我的猜测是您的其中一个连接有问题。很可能是在至少一个连接中缺少第二个连接谓词(意味着您需要一个 AND)。没有表定义和数据虽然无法确定。
  • 对不起,肖恩,我在上面压缩了我正在寻找的内容,以便更容易理解(更少的列)。
  • 很可能是因为您要从 customFields 表(或其他表)中提取多行。您可能必须在该表中执行诸如枢轴之类的操作,以使您的所有记录都在一条记录中。否则,您将在查询中为您拥有的每个自定义字段创建单独的记录。了解有关表结构的更多信息将有助于弄清楚。

标签: sql-server group-by distinct


【解决方案1】:

您可以从分组列表中删除信息列并将max() 添加到您的代码中或将所有聚合放入子查询中:

SELECT  
     c.clientID
    ,c.firstName AS 'First_Name'
    ,c.lastName  AS 'Last_Name'
    ,c.homePhone AS 'Home'
    ,c.cellPhone AS 'Cell'
    ,NULL        AS '------'
    ,info.*
FROM clients c
OUTER APPLY
(
  SELECT
    max(CASE
        WHEN ccf.name LIKE 'First Contact Date' THEN ccv.TextVal
     END)         AS 'First_Contact_Date'
    ,max(CASE
        WHEN ccf.name LIKE 'Referral Date' THEN ccv.DateVal
     END)         AS 'Referral_Date'
    ,max(CASE
        WHEN ccf.name LIKE 'Referred By' THEN ccv.TextVal
     END)         AS 'Referred_By'
    ,max(CASE
        WHEN ccf.name LIKE 'Intake Date' THEN ccv.DateVal
     END)         AS 'Intake_Date'
    ,max(CASE
        WHEN ccf.name LIKE 'Intake By' THEN ccv.TextVal
     END)         AS 'Intake_By'
    ,max(CASE
        WHEN ccf.name LIKE 'Orientation Date' THEN ccv.TextVal
     END)         AS 'Orientation_Date'
    ,max(CASE
        WHEN civ.clientIndexID = 5 THEN civ.clientIndexValueName
     END)         AS 'Primary_Language'
    ,NULL        AS '------'
    ,max(CASE
        WHEN civ.clientIndexID = 18 THEN civ.clientIndexValueName
     END)         AS 'Type'
    ,max(CASE
        WHEN civ.clientIndexID = 20 THEN civ.clientIndexValueName
     END)         AS 'Stage_at_intro'
    ,max(CASE
        WHEN civ.clientIndexID = 21 THEN civ.clientIndexValueName
     END)         AS 'Current_stage'
    ,max(CASE
        WHEN civ.clientIndexID = 19 THEN civ.clientIndexValueName
     END)         AS 'Percentage'
    ,max(CASE
        WHEN civ.clientIndexID = 26 THEN civ.clientIndexValueName
     END)         AS 'Location'
    ,max(CASE
        WHEN civ.clientIndexID = 27 THEN civ.clientIndexValueName
     END)         AS 'Eligible?'
    FROM tblClientCustomValues ccv
    INNER JOIN tblClientCustomFields ccf
        ON ccv.ID = ccf.ID
    INNER JOIN tblClientIndexData cid
        ON ccv.clientID = cid.clientID
    INNER JOIN tblClientIndexValue civ
        ON cid.clientIndexValueID = civ.clientIndexValueID
    WHERE c.clientID = ccv.clientID
) info

【讨论】:

  • 试过这个,得到一个我找不到的语法错误:查询错误:','附近的语法不正确。
  • 找到了。看起来这很完美!感谢您花时间审阅此内容。
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多