【问题标题】:Displaying three different columns from three Different Tables in SQL在 SQL 中显示三个不同表中的三个不同列
【发布时间】:2019-06-21 14:30:07
【问题描述】:

我试图在 SQL 中显示三个不同的列,它们都来自同一个数据库,但每个列都来自不同的表。一列称为名称,我也希望将输出分组,另一列是称为货币的两列之间的计算,第三列是日期。 NameId 连接 Name 和 Money Column,MoneyId 连接 Money 和 Date

我在 dbVisualizer 上创建它,这三列都是同一数据库中不同表的所有部分。如何在按名称列分组的同时显示计算出的 Money 列及其正确日期

我知道这是不正确的,但这是我目前所拥有的。我怎样才能进行货币计算,但又不必将其属性放入按函数分组的函数中才能运行。

Select A.Name,
MAX(B.BillsPaid)As Paid, 
MAX(B.BillsSent) As Sent, C.DateId As Date_Id,
-- This is the money Calculation 
(CAST(BillsPaid As decimal(5,0))/CAST(nullif(BillsSent, 0) As 
decimal(5,0))) 
* 100 as Money
From B
Inner Join A on B.NameId = A.NameId
Inner Join C on B.MoneyId = C.MoneyId
Group By A.Name, C.DateId, B.BillsPaid, B.BillsSent 

我想在显示器上看到这个。我是 SQL 新手,非常感谢所有帮助,谢谢。

 Name          Money(%)      Date
John Doe        87%         June 2019

我看到了

 Name       Paid      Sent     Money     Date 
John Doe     2          4       50%     June 2019
John Doe     1          4       25%     June 2019
John Doe     3          4       75%     July 2019

我希望按每个姓名、每个日期对钱进行分组,但是每个姓名每月支付/发送的金额不止一个

【问题讨论】:

  • 你为什么要分组B.BillsPaidB.BillsSent上聚合?
  • 我需要支付账单的百分比,如果我不将它们放入组中,我会收到错误,我不想将它们分组
  • 不分组会有什么错误?在GROUP BY 中放入一些东西并聚合列是完全多余的。您可以简单地删除MAXGROUP BY 并使用DISTINCT,您会在这里得到相同的结果。
  • 肯定有一点样本数据来配合预期的输出会有所帮助,但如果我不得不猜测,我想你想删除 MAX(..) 行,SUM() @ 里面的两个字段987654332@ 方程,并从您的分组中删除 BillsPaidBillsSent
  • 感谢您的反馈。我删除了 Max(..) 并将其替换为 SUM(..),并从组中删除了这些列,但是我仍然收到错误消息 1) [代码:8120,SQL 状态:S1000] 列 'BillsPaid' 无效在选择列表中,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 BillsSent 出现同样的错误

标签: sql sql-server group-by nested-queries dbvisualizer


【解决方案1】:

我相信这会让你得到你想要的 - 交叉应用有点奇怪,但它很方便 :) 如果你想了解更多关于那个的信息,谷歌有很多!

Select
    A.Name
    ,b.[Paid]
    ,b.[Sent]
    ,min(C.DateId) [Date_Id]
    ,(CAST(b.paid As decimal(5,0))/CAST(nullif(b.[sent], 0) as decimal(5,0))) * 100 [Money]
From
    a
    cross apply (
        select
            max(billspaid) [Paid]
            ,max(billssent) [Sent]
        from
            B
        where
            A.NameId = B.NameId
    ) b
    inner join C
        on B.MoneyId = C.MoneyId
group by
    A.Name
    ,b.[Paid]
    ,b.[Sent]

编辑

Select
    a.Name
    ,b.[Paid]
    ,b.[Sent]
    ,min(C.DateId) [Date_Id]
    ,(CAST(b.paid As decimal(5,0))/CAST(nullif(b.[sent], 0) as decimal(5,0))) * 100 [Money]
From
    a
    cross apply (
        select
            max(billspaid) [Paid]
            ,max(billssent) [Sent]
        from
            B
        where
            A.NameId = B.NameId
    ) b
    inner join b b1
        on a.nameid = b1.nameid
    inner join c
        on b1.MoneyId = c.MoneyId
group by
    a.Name
    ,b.[Paid]
    ,b.[Sent]

【讨论】:

  • 谢谢 Toni,这肯定更接近我正在寻找的内容,但是当我运行查询时,我得到 1) [代码:207,SQL 状态:42S22] 无效的列名 'BillsPaid' .和 BillsSent 以及 MoneyId
  • 这将是您的表/列名 - 我假设您输入了虚拟表和列名以保护您的公司数据机密......那种东西我无法提供帮助因为我不与您合作或无法访问您的表/列名称服务器库
  • 我非常感谢您的帮助,是的,这些不是我正在使用的实际列名,但我重新检查了查询中的列名,它们的名称正确,但我仍然遇到同样的错误.我花了一些时间在谷歌上搜索,但似乎无法弄清楚这一点。
  • select max(需要成为您的实际列名) [付费] ,max(需要成为您的实际列名) [已发送]
  • 这有帮助吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
相关资源
最近更新 更多