2010-08-25 56 views
2

这里的总和是我当前的查询:我需要提高我的T-SQL查询,这样我可以返回列

SELECT patron_name, 
    producer.federal_number, 
    hst_number, 
    average_bf_test, 
    (SELECT MAX(s.statement_number) FROM statement s) AS statement_number, 
    (SELECT MAX(s.period_ending) FROM statement s) AS period_ending 
    FROM producer 
    JOIN producer_details ON producer.federal_number = producer_details.federal_number 
    JOIN statement ON producer.patron_number = statement.patron_number 
    WHERE producer.patron_number = @PatronNo 

我需要改善它,这样我可以取回钱列的总和在我的 '支付' 表:

quota_payment (money) 
    total_deductions (money) 
    net_cheque_or_direct_deposit (money) 
    interim_payment (money) 
    final_payment (money) 
    statement_number (int) (FK) (statement_number is the primary key in the statement table) 

按@ Quassnoi的要求,这里是样本数据和@ Quassnoi的查询输出:

producer Table: 
patron_number patron_name federal_number 
20109  A. Beaton 44373 

producer_details Table: 
federal_number hst_number average_bf_test 
44373  R999999999 0.0392 

statement Table: 
statement_number period_ending description   amount_shipped patron_number 
386    2009/07/30  Quota Milk Shipped 32.91   20109 
387    2009/11/30  Quota Milk Shipped 22.34   20109 

payment Table: 
quota_payment total_deductions net_cheque_or_direct_deposit interim_payment 
22872.5800  7526.6500   15345.9300     6520.7000 
18474.3400  4563.2300   13911.1100     3220.3000 
final_payment statement_number 
8825.2300  386 
10690.8100  387   

这是@ Quassnoi查询返回的数据(最初第二行是钱列的NULL,但事实证明,那是因为当时付款表中只有一行,但我已经因为增加了一个额外的行):

patron_name federal_number hst_number average_bf_test  
A. Beaton 44373   R999999999 0.0392       
A. Beaton 44373   R999999999 0.0392        

statement_number period_ending  quota_payment total_deductions 
387    2009/11/30  22872.5800  7526.6500 
387    2009/11/30  18474.3400  4563.2300 

net_cheque_or_direct_deposit interim_payment  final_payment 
15345.9300      6520.7000   8825.2300 
13911.1100      3220.3000   10690.8100 

这里是希望的记录:

patron_name federal_number hst_number average_bf_test  
A. Beaton 44373   R999999999 0.0392 

statement_number period_ending  quota_payment total_deductions 
387    2009/11/30  41346.92  12089.88 


net_cheque_or_direct_deposit interim_payment  final_payment 
29257.04      9741.00    19516.04 

我忘了提,为了钱列的和值应该是“今年迄今为止”值(意值从前一年起将不会包含在SUM结果中),这使得它更加复杂一些。

+0

我需要支付表中的每个钱列保留在返回结果中的单独列,但查询应返回每列的所有行的总和。 – brookmarker 2010-08-25 15:19:37

+2

我认为我的答案是做你想做的,但是,你的原始查询做你想要的?看起来好像您需要关于@PatronNo的信息,但是当您获得MAX语句时,您将从任何patron_number获得最大语句。我不确定那是你想不想或者我不理解你正确查询。 – kralco626 2010-08-25 15:29:26

+0

是的,我的原始查询确实做了我想要的。我需要检索max statement_number和period_ending – brookmarker 2010-08-25 15:42:29

回答

1

你可以试试这个:

Select 
patron_name, 
federal_number, 
hst_number, 
average_bf_test, 
statement_number, 
period_ending, 
sum(quota_payment) as quota_payment, 
sum(total_deductions) as total_deductions, 
sum(net_cheque_or_direct_deposit) as net_cheque_or_direct_deposit, 
sum(interim_payment) as interim_payment, 
sum(final_payment) as final_payment 
from (Quassnois Query here) a 
group by 
patron_name, 
federal_number, 
hst_number, 
average_bf_test, 
statement_number, 
period_ending 

这应该根据你发布的数据得到你想要的。我不知道这是否符合你的情况,但它应该起作用。

+0

哦,我的冰箱实际上工作..感谢大家的帮助! – brookmarker 2010-08-26 14:26:58

0

如果我理解你希望做的,这应该工作,没有测试语法...根据您的评论

也许你在寻找:

Select a.*,sum(quota_payment) as sum_quota_payment, 
    sum(total_deductions) as sum_total_deductions, 
    sum(net_cheque_or_direct_deposit) as sum_net_cheque, 
    sum(interim_payment) as sum_interim_payment, 
    sum(final_payment) as sum_final_payment 

     from 
     (SELECT patron_name, 
      producer.federal_number, 
      hst_number, 
      average_bf_test, 
      (SELECT MAX(s.statement_number) FROM statement s) AS statement_number, 
      (SELECT MAX(s.period_ending) FROM statement s) AS period_ending 
      FROM producer 
      JOIN producer_details ON producer.federal_number = producer_details.federal_number 
      JOIN statement ON producer.patron_number = statement.patron_number 
      WHERE producer.patron_number = @PatronNo) 
    a left join payment ON a.statement_number = payment.statement_number 
+0

woops我需要一群在那里不要我。尝试添加“group by a.statement_number”到任一查询的末尾。这是否让你想要什么? – kralco626 2010-08-25 15:23:56

+0

不完全。我收到错误“多部分标识符”statement.statement_number“无法绑定”。即使在最后添加了GROUP BY。 – brookmarker 2010-08-25 15:30:25

+0

不好意思,应该用过这个阿尼亚斯了。再试一次。 – kralco626 2010-08-25 15:31:56

1
SELECT patron_name, 
     producer.federal_number, 
     hst_number, 
     average_bf_test, 
     (
     SELECT MAX(s.statement_number) 
     FROM statement s 
     ) AS statement_number, 
     (
     SELECT MAX(s.period_ending) 
     FROM statement s 
     ) AS period_ending, 
     sums.* 
FROM producer 
JOIN producer_details 
ON  producer_details.federal_number = producer.federal_number 
JOIN statement so 
ON  so.patron_number = producer.patron_number 
CROSS APPLY 
     (
     SELECT SUM(quota_payment) AS quota_payment, 
       SUM(total_deductions) AS total_deductions, 
       SUM(net_cheque_or_direct_deposit) AS net_cheque_or_direct_deposit, 
       SUM(interim_payment) AS interim_payment, 
       SUM(final_payment) AS final_payment 
     FROM payment p 
     WHERE p.statement_number = so.statement_number 
     ) sums 
WHERE producer.patron_number = @PatronNo 
+0

但是,它可以返回两行数据而不是一行(还有一些逗号被SUM忽略)。第一行数据是全部正确的,但是,第二行数据返回所有NULLS的钱列,其他数据是正确的。 – brookmarker 2010-08-25 16:10:42

+0

@brookmaker:你可以发布一些示例数据和查询的输出吗? – Quassnoi 2010-08-25 16:30:25

+0

@Q - +1可能比我的更好。不错,我不太熟悉交叉申请。 – kralco626 2010-08-25 16:40:18

相关问题