2015-09-04 121 views
0

我目前正在计算一个更大的一组数据与一些联接和最终的结果是跨两个表的计算。我的当前脚本如下所示:复杂的计算 - SQL Server

USE db1 
Go 

SELECT 
    customer, tb1.custid 
FROM 
    [dbo].[tb1] 
LEFT OUTER JOIN 
    [dbo].[tb2] ON tb1.custid = tb2.custid 
LEFT OUTER JOIN 
    [dbo].[tb3] ON tb2.custnumber = tb3.custnumber 
LEFT OUTER JOIN 
    [dbo].[tb4] ON tb2.custid = tb4.custid 
WHERE 
    tb1.custclass = 'non-person' 
    AND tb4.zip IN ('11111', '11112') 
GO 

正如您所看到的,它不是最干净的,但它用于收集初始信息。连接数量的原因是由于我没有创建一个令人难以置信的奇怪表格结构,而且我需要的数字数据只存储在tb3中。

我现在要做的是计算tb3中所有设置为数字字段的3个字段的总和,并对第4个字段(也是数字)进行AND/OR比较。我知道我可以将它们汇总在一起,但我希望在三件事情上进行一些输入:

  1. 何处将SUM计算置于查询中?
  2. 在哪里放置以及如何将SUM总数与第4场进行比较?
  3. 是否有可能将两个值中较高的值返回到初始SELECT中的TOTAL列?

在此先感谢您。

+0

一次做一件事。从一个简单的总和开始。你在哪里可以放置哪些选项? –

+0

将数据分散在多个表中并不罕见。但在加入多个表格时请小心谨慎:如果您在t4中有三条匹配的记录,则可以将t3数据重复三次。另外:你确定你需要外部连接吗?最后一个甚至不起作用,因为您比较WHERE子句中的t4值,而不考虑在外连接记录的情况下该值为空。如果您确实需要外连接,则可能需要将该条件移至ON子句。 –

回答

1

在哪里放置SUM计算在查询中?

如果你想它的输出,你可能只想把它添加到SELECT

SELECT 
    customer, tb1.custid 
    (tb3.col1 + tb3.col2 + tb3.col3) as Sum 
FROM 
    ... 

放在什么地方和如何做的总和对第4场的比较呢?

你可能想用CASE语句来做到这一点,这也回答你最后一个问题

是否有可能返回两个值中的较高者共列在最初的选择?

SELECT 
    customer, tb1.custid 
    CASE WHEN (tb3.col1 + tb3.col2 + tb3.col3) > tb3.col4 
     THEN (tb3.col1 + tb3.col2 + tb3.col3) 
     ELSE tb3.col4 
    END as Total 
FROM 
    ... 
0

你应该能够计算总和为嵌套查询:

SELECT (field1 + field2 + field3) AS fields_sum FROM tb3 (...) 

然后在你的主查询,你可以这样做:

SELECT customer, tb1.custid, (CASE WHEN fields_sum > fourth_field THEN fields_sum ELSE fourth_field END) AS TOTAL (...) 
+0

从“来自tb3的3个字段的总和”这个问题 - 您的第一部分将整个表中的一个字段相加。 – Jamiec

+1

已编辑;那里我没有给予足够的重视。谢谢。无论如何,你的解决方案可能更优雅一些。 – sschimmel