SQL Count 使用来自连接的信息

Posted

技术标签:

【中文标题】SQL Count 使用来自连接的信息【英文标题】:SQL Count uses info from join 【发布时间】:2018-02-06 22:14:46 【问题描述】:

我需要计算每个站点编号和每个订单模式出现的 InternalMenuLinkItemNumber 次数。然后我需要显示 MenuItemID 并使用项目编号通过内部连接来执行此操作,但是当我添加此连接时,它会扭曲 QTY 结果。我试过在 COUNT 中使用 distinct,但所有的 QTY 都是 1。请协助。

QTY 结果 100% 正确但没有 MenuItemID 的查询和结果。

 SELECT ST_Sites.BusinessUnit,[ST_SalesMixTransactions_RealTimeFeed].SiteNumber,InternalMenuLinkItemNumber,[ST_SalesMix].MenuItemID,OrderMode,SellingPrice,COUNT(ST_SalesMixTransactions_RealTimeFeed.InternalMenuLinkItemNumber) as QTY 

FROM ST_AlohaSalesMixTransactions_RealTimeFeed

inner join ST_Sites on ST_Sites.SiteNumber= [ST_SalesMixTransactions_RealTimeFeed].SiteNumber 

where [ST_SalesMixTransactions_RealTimeFeed].BusinessDate between'2017-06-27'and'2017-07-03' and [ST_SalesMixTransactions_RealTimeFeed].SiteNumber = '1001006'

group by InternalMenuLinkItemNumber,[ST_SalesMixTransactions_RealTimeFeed].SiteNumber,OrderMode,SellingPrice,ST_Sites.BusinessUnit,[ST_SalesMix].MenuItemID

order by InternalMenuLinkItemNumber 

QTY 符合预期的结果:

如果我添加内部连接来获取 MenuItemID: 查询:

SELECT ST_Sites.BusinessUnit,[ST_SalesMixTransactions_RealTimeFeed].SiteNumber,InternalMenuLinkItemNumber,[ST_SalesMix].MenuItemID,OrderMode,SellingPrice,COUNT(ST_SalesMixTransactions_RealTimeFeed.InternalMenuLinkItemNumber) as QTY 

FROM ST_AlohaSalesMixTransactions_RealTimeFeed

inner join ST_SalesMix on [ST_AlohaSalesMixTransactions_RealTimeFeed].InternalMenuLinkItemNumber= ST_SalesMix.ItemNumber

inner join ST_Sites on ST_Sites.SiteNumber= [ST_SalesMixTransactions_RealTimeFeed].SiteNumber 

where [ST_SalesMixTransactions_RealTimeFeed].BusinessDate between'2017-06-27'and'2017-07-03' and [ST_SalesMixTransactions_RealTimeFeed].SiteNumber = '1001006'

group by InternalMenuLinkItemNumber,[ST_SalesMixTransactions_RealTimeFeed].SiteNumber,OrderMode,SellingPrice,ST_Sites.BusinessUnit,[ST_SalesMix].MenuItemID

order by InternalMenuLinkItemNumber

QTY 现在偏离的结果:

如果我使用不同的: 查询:

SELECT ST_Sites.BusinessUnit,[ST_SalesMixTransactions_RealTimeFeed].SiteNumber,InternalMenuLinkItemNumber,[ST_SalesMix].MenuItemID,OrderMode,SellingPrice,COUNT(distinct ST_SalesMixTransactions_RealTimeFeed.InternalMenuLinkItemNumber) as QTY 

FROM ST_AlohaSalesMixTransactions_RealTimeFeed

inner join ST_SalesMix on [ST_AlohaSalesMixTransactions_RealTimeFeed].InternalMenuLinkItemNumber= ST_SalesMix.ItemNumber

inner join ST_Sites on ST_Sites.SiteNumber= [ST_SalesMixTransactions_RealTimeFeed].SiteNumber 

where [ST_SalesMixTransactions_RealTimeFeed].BusinessDate between'2017-06-27'and'2017-07-03' and [ST_SalesMixTransactions_RealTimeFeed].SiteNumber = '1001006'

group by InternalMenuLinkItemNumber,[ST_SalesMixTransactions_RealTimeFeed].SiteNumber,OrderMode,SellingPrice,ST_Sites.BusinessUnit,[ST_SalesMix].MenuItemID

order by InternalMenuLinkItemNumber

QTY 的结果现在全为 1:

【问题讨论】:

这些表的 PK 和 FK 是什么? 你真的在使用 mysql 吗? (看起来更像 SQL Server。) 你需要先在子查询中进行计数,然后再加入菜单项或者你需要进行计数(distinct ...),没有样本数据有点难以分辨。跨度> 为什么是 MySQL 标签?? 删除了模糊的 mysql 产品标签。 【参考方案1】:

如果我理解正确,你想要类似的东西

SELECT SiteNumber, OrderMode, count([DISTINCT?] InternalMenuLinkItemNumber)
...
GROUP BY SiteNumber, OrderMode

您要计算 InternalMenuLinkItemNumber,因此 InternalMenuLinkItemNumber 不能出现在 GROUP BY 子句中。

编辑: 使用 GROUP BY 时,SELECT 列表只能包含在 GROUP BY 子句中也提到的列,或聚合函数(在任意列上)。

【讨论】:

如果我将它从组中删除,那么它会抱怨“消息 8120,级别 16,状态 1,第 7 行列 'ST_AlohaSalesMixTransactions_RealTimeFeed.InternalMenuLinkItemNumber' 在选择列表中无效,因为它不包含在任何一个聚合函数或 GROUP BY 子句。” 如果我写 [DISTINCT?] 我得到错误:“消息 102,级别 15,状态 1,第 7 行 'ST_AlohaSalesMixTransactions_RealTimeFeed' 附近的语法不正确。” 对于[DISTINCT?],我的意思是根据您可能需要的用例? DISTINCT 在这里。 与 distinct 它使所有事物的计数结果为 1 那是因为您按 InternalMenuLinkItemNumber 分组。【参考方案2】:

试试这个:

SELECT a.InternalMenuLinkItemNumber, a.SiteNumber, a.OrderMode, a.SellingPrice, a.BusinessUnit, a.MenuItemID, a.QTY, CASE WHEN MAX(b.MenuItemID) = MIN(b.MenuItemID) THEN MAX(b.MenuItemID) ELSE -1 END AS MenuItemID
    FROM
        (SELECT ST_Sites.BusinessUnit, [ST_SalesMixTransactions_RealTimeFeed].SiteNumber, InternalMenuLinkItemNumber, [ST_SalesMix].MenuItemID, OrderMode, SellingPrice, COUNT(ST_SalesMixTransactions_RealTimeFeed.InternalMenuLinkItemNumber) as QTY 
            FROM ST_AlohaSalesMixTransactions_RealTimeFeed
            INNER JOIN ST_Sites on ST_Sites.SiteNumber = [ST_SalesMixTransactions_RealTimeFeed].SiteNumber 
            WHERE [ST_SalesMixTransactions_RealTimeFeed].BusinessDate between'2017-06-27'and'2017-07-03' and [ST_SalesMixTransactions_RealTimeFeed].SiteNumber = '1001006'
            GROUP BY InternalMenuLinkItemNumber, [ST_SalesMixTransactions_RealTimeFeed].SiteNumber, OrderMode, SellingPrice, ST_Sites.BusinessUnit, [ST_SalesMix].MenuItemID
         ) a
    INNER JOIN ST_SalesMix b ON a.InternalMenuLinkItemNumber = b.ItemNumber
    GROUP BY a.InternalMenuLinkItemNumber, a.SiteNumber, a.OrderMode, a.SellingPrice, a.BusinessUnit, a.MenuItemID, a.QTY
    ORDER BY a.InternalMenuLinkItemNumber

它的原理是您的第一个查询给出了很好的计数,因此请保持原样(现在是内部查询),然后在它之外进行有问题的联接。显然,ST_SalesMix 对于第一个查询中的每个正确计数的行都有很多行,所以我在原始组列表上进行分组,但这意味着您可能会获得多个 MenuItemID。我正在通过测试 MAX 和 MIN MenuItemIDs 在 CASE 语句中检查这一点 - 如果它们相同,则返回 MAX(MenuItemID) 否则我将返回 -1 作为错误标志,以指示有多个 MenuItemIDs 与此组相关联.这可能不是最有效的方法,但我没有太多工作要做。

我希望这会有所帮助。

【讨论】:

【参考方案3】:

现在全部排序。谢谢大家。 @jwolf 你建议的查询就是答案。

【讨论】:

抱歉,我刚刚看到这条消息 - 我的屏幕还没有更新。你介意“接受”作为答案吗?谢谢,约翰。 嗨,Deon,很高兴我的解决方案对您有用。你介意“接受”它作为答案吗?谢谢,约翰。

以上是关于SQL Count 使用来自连接的信息的主要内容,如果未能解决你的问题,请参考以下文章

具有多个左连接的 SQL 重复行

在 Amazon QuickSight 中使用自定义 SQL 时,连接在哪里执行?

使用 Count() 和窗口函数的 sql 内部连接

使用 COUNT() 左连接的 SQL

连接查询(MySQL)

SQL - oracle - 如何从连接结果中选择特定部门