【问题标题】:SQL Server query with sums from multiple tables使用来自多个表的总和的 SQL Server 查询
【发布时间】:2018-09-22 05:06:05
【问题描述】:

我有 3 个表,我试图从中报告它们都是相关的,但有不同数量的记录。我想要每个订单的摘要行,显示职位描述、总价格和总成本。

我的表格如下:

价格

| Order | Line # | Description  | Price |
+-------+--------+--------------+-------+
| 1     | 1      | Line 1 job#1 | 100   |
| 1     | 2      | Line 2 job#1 | 30    |
| 2     | 1      | Line 1 job#2 | 100   |
| 3     | 1      | Line 1 job#3 | 75    |

成本线

| Order | Line # | Cost record | Cost |
+-------+--------+-------------+------+
| 1     | 1      | 1           | 80   |
| 1     | 2      | 2           | 80   |
| 1     | 2      | 3           | 50   |
| 2     | 1      | 1           | 75   |
| 3     | 1      | 1           | 50   |
| 3     | 1      | 2           | 50   |

订单标题

| Order | Description | Sales Person |
+-------+-------------+--------------+
| 1     | Order # 1   | 1            |
| 1     | Order #2    | 2            |
| 1     | Order #3    | 1            |

我不断获得许多相关行。我一直在尝试使用 sum 的子查询,但我无法让它工作。

预期结果:

 | Order | Description | Price | Cost | Sales Person |
 +-------+-------------+-------+------+--------------+
 | 1     | Order #1    | 130   | 210  | 1            | 
 | 2     | Order #2    | 100   | 75   | 2            |
 | 3     | Order #3    | 75    | 100  | 1            | 

【问题讨论】:

  • 预期结果是什么?
  • 订单存储在哪里?我假设在Order Header,但里面只有一个订单(有三个不同的描述和两个不同的销售人员),所以这不可能......为什么Cost lines 中有两条记录具有相同的@ 987654327@ 订单 1?
  • 具体的数据库引擎是什么? (例如 Oracle、PostgreSQL、MySQL、SQL Server 等)
  • 我认为“价格”应该高于“成本”。但是,订单 #1 的价格仅为 130 美元(100 + 30),而成本为 210 美元(80 + 80 + 50)。这有什么意义?
  • 我正在使用 SQL Server。人们希望价格高于成本,但并非总是如此。我的目标不是落后于业务规则,而是生成正确的 SQL 语法。我可以编写单个查询并从表中获取总和,但是当我加入它们时,我得到的结果太多了。

标签: sql sql-server sum


【解决方案1】:

我假设您的示例数据有错误,第一列应该是123,而不是三倍于1。至少你想要的结果看起来很合理。

将成本和价格加入订单,然后GROUP BY 订单并计算成本和价格的总和。

 SELECT o.[Order],
        o.[Description],
        sum(p.[Price]) [Price],
        sum(c.[Cost]) [Cost],
        o.[Sales Person]
        FROM [Order Header] o
             LEFT JOIN [Cost lines] c
                       ON c.[Order] = o.[Order]
             LEFT JOIN [Prices] p
                       ON p.[Order] = o.[Order]
        GROUP BY o.[Order],
                 o.[Description],
                 o.[Sales Person];

【讨论】:

  • 谢谢粘位。不,它们都是为了 1,我可能应该为每个添加一个唯一的主键。这只是示例数据,因为真实数据库过于庞大,无法在此处加载。让我试试这个逻辑,看看会发生什么。
  • 实际情况是实际总价格乘以相关成本行数,总成本乘以相关价格行数。这里附上的是我真实数据库中的实际语法。也许这可以帮助您了解我在哪里搞砸了。
  • 我无法添加该语句,因为它太长了。我将它添加到 2 件中
  • 好吧,我必须修改我的脚本,因为我有“@”变量并且系统认为我试图标记太多人
  • SELECT J.job_id, J.sub_job_id, J.sales_rep_id, SUM(A.Price) AS Price, A.entered_by, A.description, A.update_date, SUM(P.cost_production) AS ' AA 成本', SUM(P.hours) AS 'AA 小时', J.prod_div_id 从作业 J LEFT JOIN 更改 A ON A.job_id = J.job_id AND A.sub_job_id = J.sub_job_id AND (A.update_date = @StartDate ) AND J.prod_div_id = '10' LEFT JOIN productiontran P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多