【问题标题】:Sql left join plus CASE querysql左连接加CASE查询
【发布时间】:2016-12-05 23:33:28
【问题描述】:

我一直在使用数据库进行访问,但我第一次必须使用 MS SQL Server 2012,因此,我必须编写查询,因为我发现查询构建器不像访问那样用户友好。

我被困的问题不是一个非常具有挑战性的问题。我有 2 个表如下:

  • dbo.WF_PM_ACCT_DET_DB with columns to use Account, Postal_Code, Client_Birth_Date
  • dbo.WF_PM_SUM_DB with columns to use Account, Total_Avg_AuA

我想要做的是查询按邮政编码分组的结果,计算相应邮政编码中的客户数量,还按年龄分组,其中 AuA > 0

所以首先我需要按年龄将客户分为 3 组(55)。然后计算该特定年龄组的特定邮政编码中有多少客户。还要从第二个表中仅选择 sum(AuA)>0 的客户端。输出看起来像这样

Postal code   CountofClient Age_group
1m1 2m2          50            <35
1m1 2m2          20           35-50
and so on...

到目前为止,这是我所拥有的:

SELECT        Postal_Code, COUNT(Account) AS Count_Account, Age,                 
AVG(YEAR(GETDATE()) - YEAR(client_birth_date)) AS 'Age'

CASE WHEN AGE <=35                       THEN 'AGEGROUPA'
       WHEN AGE >35 AND AGE <55          THEN 'AGEGROUPB'
       WHEN AGE >=55                     THEN 'AGEGROUPC'
end as 'clientageseg'

FROM            dbo.WF_PM_ACCT_DET_DB
GROUP BY Postal_Code, Client_Birth_Date, Age

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: sql sql-server database left-join


    【解决方案1】:
    ;WITH cte AS (
        SELECT
           postal_code
           ,Account
           ,CASE
              WHEN
                 (DATEADD(year,DATEDIFF(year, [DOB]  ,GETDATE()) , [DOB]) > GETDATE())
              THEN DATEDIFF(year, [DOB]  ,GETDATE()) -1
              ELSE DATEDIFF(year, [DOB]  ,GETDATE())
           END as Age
       ,SUM(s.AuA) OVER (PARTITION BY a.Account) as AuASum
        FROM
           dbo.WF_PM_ACCT_DET_DB a
           INNER JOIN dbo.WF_PM_SUM_DB s
       ON a.Account = s.Account
    )
    
    SELECT
        postal_code
        ,COUNT(Account) as Count_Account
        ,CASE
           WHEN Age <= 35 THEN 'AGEGROUPA'
           WHEN Age > 35 AND Age < 55 THEN 'AGEGROUPB'
           WHEN Age >= 55 THEN 'AGEGROUPC'
        END as ClientAgeSeg
    FROM
        cte
    WHERE
       AuASum > 0
    GROUP BY
        postal_code
        ,CASE
              WHEN Age <= 35 THEN 'AGEGROUPA'
              WHEN Age > 35 AND Age < 55 THEN 'AGEGROUPB'
              WHEN Age >= 55 THEN 'AGEGROUPC'
       END
    

    欢迎从 Acess 使用 SQL Server!最终你会爱上它,你可以做的还有很多。刚开始时,需要深入研究的一些不错的功能是 Common Table Expressions [CTE]Window Functions。我在上面的例子中使用了 CTE。您不必这样做,但当您进行日期比较时,它会让您的生活更轻松。

    请注意,在计算 AGE 时,您需要确定出生日期是该年已经发生还是即将到来。

    【讨论】:

    • 这很棒。但我只需要计算帐户的总和(AuA)来自另一个表(dbo.WF_PM_SUM_DB)> 0。所以我的问题真的是:我在哪里输入左连接??
    • @DataGuy 您将在 CTE 中输入它。我不确定阅读您的帖子会如何发挥作用。我通过添加 JOIN 并使用窗口函数更新了 1 个解决方案。您也可以在 where 子句中使用相关子查询。
    • 谢谢。我正在观看有关窗口功能和 CTE 的 youtube 视频。还有其他建议吗?
    【解决方案2】:

    您可以尝试先使用 CTE 对数据进行分组,然后再应用案例:

    ;WITH CTE AS
    (
        SELECT        
            Postal_Code, 
            COUNT(Account) AS Count_Account,                 
            AVG(YEAR(GETDATE()) - YEAR(client_birth_date)) AS 'Age'
        FROM 
            dbo.WF_PM_ACCT_DET_DB
        GROUP BY Postal_Code
    )
    SELECT
        Postal_Code,
        Count_Account,
        CASE   
        WHEN AGE <= 35             THEN 'AGEGROUPA'
        WHEN AGE > 35 AND AGE < 55 THEN 'AGEGROUPB'
        WHEN AGE >= 55             THEN 'AGEGROUPC'
        END AS 'clientageseg'
    FROM CTE 
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT  DISTINCT  Postal_Code,
              COUNT(Account)OVER (PARTITION BY Postal_Code) AS Count_Account,
              Age,                 
              AVG(YEAR(GETDATE()) - YEAR(client_birth_date)) AS 'Age',
              CASE WHEN AGE <=35                       THEN 'AGEGROUPA'
                   WHEN AGE >35 AND AGE <55          THEN 'AGEGROUPB'
                   WHEN AGE >=55                     THEN 'AGEGROUPC'
              END as 'clientageseg'
      FROM dbo.WF_PM_ACCT_DET_DB A
      LEFT JOIN dbo.WF_PM_SUM S ON A.Account=S.AccountNumber
      WHERE S.AccountNumber IS NOT NULL
      

      【讨论】:

      • 谢谢。仅当另一个表中的 sum(AuA) 大于 0 时才合并我希望它计算帐户的部分怎么样?
      • @Masood 我没听懂你。你能更详细地解释一下吗?如果问题中没有提及,请发布另一个问题并分享链接。
      • 很抱歉我写得不好。问题是还有另一个表 dbo.WF_PM_SUM 有一个 AuA 列和一个帐号(这个帐号是两个表的链接。所以当我们在上面的代码中按邮政编码计算帐户时,我如何确保仅计算 AuA >0 的帐户?
      猜你喜欢
      • 2019-05-06
      • 2021-12-25
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多