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 使用来自连接的信息的主要内容,如果未能解决你的问题,请参考以下文章