我正在尝试为Microsoft Dynamics CRM创建报告。我们希望它显示过去30天内创建的订单,以及订单的用户和一些财务信息(该订单的收入,产品的总成本,毛利润)
不幸的是,数据在SQL数据库中非常分散。出现单位成本的唯一地方是销售订单明细(它实际上是我创建的自定义字段),而我需要的其他信息位于标题中(称为销售订单基础和销售订单扩展基础)对于自定义字段)
这是我现在所拥有的,它在Microsoft SQL Server中运行:
SELECT
SalesOrderBase.SalesOrderId AS [SalesOrderBase SalesOrderId]
,SalesOrderBase.Name
,SalesOrderBase.CustomerIdName
,AccountBase.Name
,SalesOrderBase.TotalAmountLessFreight
,SystemUserBase.FullName
FROM
SalesOrderBase
INNER JOIN SalesOrderExtensionBase
ON SalesOrderBase.SalesOrderId = SalesOrderExtensionBase.SalesOrderId
INNER JOIN AccountBase
ON SalesOrderExtensionBase.new_ParentCustomer = AccountBase.AccountId
INNER JOIN SystemUserBase
ON SalesOrderBase.OwnerId = SystemUserBase.SystemUserId
-- INNER JOIN SalesOrderDetailBase
-- ON SalesOrderBase.SalesOrderId = SalesOrderDetailBase.SalesOrderId
WHERE
SalesOrderBase.CreatedOn >= DATEADD(day,-30, getdate())
现在,您可以看到我注释掉的部分。问题是,如果我使用内部联接将销售订单(标题)连接到详细信息(项目),我会得到重复的结果。订单中的每个项目都显示在自己的行上,这不是我想要的!
我做了一些使用SUM函数的方法,并得到了这样的基本查询:
SELECT SUM(ExtendedAmount)
FROM [dbo].[SalesOrderDetailBase],
WHERE SalesOrderId = '{a GUID that I would type in for testing}'
我需要帮助的是将这两者结合起来。我需要SalesOrderId来使用特定行中的那个,但只需给我总和而不是每个值一行。我正在使用"扩展金额"因为"扩展金额"从项目等于"总金额减去运费"从标题 - 它是检查功能是否正常工作的好方法。一旦我开始工作,我就会将其更改为成本/利润字段。
我认为UNION可以在这里帮助我,但经过一些研究后我发现它更像是一个" AND"语句,仅显示由两个单独的查询返回的值。这根本不是我想要的......我只是想在结果中添加一列来抓取另一个表中值的总和。
再一次,这是Microsoft SQL Server,而不是MySQL。
由于
答案 0 :(得分:0)
非常确定你只需要包括你的SUM和一个小组。我清理了您的查询格式并添加了一些别名,以便更容易维护。这应该非常接近。
SELECT
sob.SalesOrderId AS [SalesOrderBase SalesOrderId]
, sob.Name
, sob.CustomerIdName
, ab.Name
, sob.TotalAmountLessFreight
, sub.FullName
, SUM(sodb. ExtendedAmount) as ExtendedAmountTotal
FROM SalesOrderBase sob
INNER JOIN SalesOrderExtensionBase soeb ON sob.SalesOrderId = soeb.SalesOrderId
INNER JOIN AccountBase ab ON soeb.new_ParentCustomer = ab.AccountId
INNER JOIN SystemUserBase sub ON sob.OwnerId = sub.SystemUserId
INNER JOIN SalesOrderDetailBase sodb ON sob.SalesOrderId = sodb.SalesOrderId
WHERE sob.CreatedOn >= DATEADD(day, -30, getdate())
GROUP BY sob.SalesOrderId
, sob.Name
, sob.CustomerIdName
, ab.Name
, sob.TotalAmountLessFreight
, sub.FullName
答案 1 :(得分:0)
同样,不是很清楚你要求的是什么,但我认为你得到的是你想要一个像这样的小组。
SELECT
SalesOrderBase.SalesOrderId AS [SalesOrderBase SalesOrderId]
,SalesOrderBase.Name
,SalesOrderBase.CustomerIdName
,AccountBase.Name
,SalesOrderBase.TotalAmountLessFreight
,SystemUserBase.FullName
,SUM(SalesOrderDetailBase.ExtendedAmount) AS ExtendedAmount
FROM
SalesOrderBase
INNER JOIN SalesOrderExtensionBase
ON SalesOrderBase.SalesOrderId = SalesOrderExtensionBase.SalesOrderId
INNER JOIN AccountBase
ON SalesOrderExtensionBase.new_ParentCustomer = AccountBase.AccountId
INNER JOIN SystemUserBase
ON SalesOrderBase.OwnerId = SystemUserBase.SystemUserId
INNER JOIN SalesOrderDetailBase
ON SalesOrderBase.SalesOrderId = SalesOrderDetailBase.SalesOrderId
WHERE
SalesOrderBase.CreatedOn >= DATEADD(day,-30, getdate())
GROUP BY SalesOrderBase.SalesOrderId
,SalesOrderBase.Name
,SalesOrderBase.CustomerIdName
,AccountBase.Name
,SalesOrderBase.TotalAmountLessFreight
,SystemUserBase.FullName