【问题标题】:Estimate male and female customers by partition按分区估算男性和女性客户
【发布时间】:2021-01-13 23:36:12
【问题描述】:

我有五个表,其中包含有关银行详细信息的人工数据。

我的目的是为男性客户和女性客户准备 2 个最常用的交易地点的查询。

为了做到这一点,我写了这个查询:

SELECT c.Gender,
lo.Name, 
COUNT(c.Gender) OVER(PARTITION BY lo.Name) as TotalPerAccount
FROM dbo.Customer AS c
INNER JOIN dbo.Account AS a ON a.CustomerId=c.Id
INNER JOIN dbo.AccountDetails AS acc ON acc.AccountId=a.Id
INNER JOIN dbo.Location as lo ON lo.Id=acc.LocationId
ORDER BY c.Gender

但是上面的代码并没有给我很好的结果。实际上,我从每个位置都得到了一些结果。您可以在下面看到输出:

[![在此处输入图片描述][1]][1]

您还可以在此处查看帐户图以及表之间的关系。

[![在此处输入图片描述][2]][2]

那么任何人都可以帮我解决这个问题吗?最终输出应如下图所示。

[![在此处输入图片描述][3]][3]

【问题讨论】:

  • 您的预期结果是什么?您不是在使用GROUP BY 而不是使用窗口化的COUNT(通过使用OVER)吗?
  • 我已经把图片最终输出应该是什么样子了
  • “我已经把图片最终输出应该是什么样子了” 当我发表评论时,图片不在那里。那个图像证实了我的怀疑;您应该使用 GROUP BY 而不是使您的 COUNT 成为窗口聚合。

标签: sql-server join window-functions


【解决方案1】:

我没有您的数据集,但我相信以下内容会为您提供所需的结果:

SELECT c.Gender,
lo.Name, 
COUNT(c.Gender) as TotalPerAccount
FROM dbo.Customer AS c
INNER JOIN dbo.Account AS a ON a.CustomerId=c.Id
INNER JOIN dbo.AccountDetails AS acc ON acc.AccountId=a.Id
INNER JOIN dbo.Location as lo ON lo.Id=acc.LocationId
GROUP BY c.Gender, lo.Name
ORDER BY c.Gender

编辑

如果您想看到最多(例如前 2 名/前 10 名),那么您可以这样实现:

SELECT TOP 10
c.Gender,
lo.Name, 
COUNT(c.Gender) as TotalPerAccount
FROM dbo.Customer AS c
INNER JOIN dbo.Account AS a ON a.CustomerId=c.Id
INNER JOIN dbo.AccountDetails AS acc ON acc.AccountId=a.Id
INNER JOIN dbo.Location as lo ON lo.Id=acc.LocationId
GROUP BY c.Gender, lo.Name
ORDER BY TotalPerAccount desc, c.Gender

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 2013-06-11
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多