2013-04-26 66 views
1

我绝对是一个SQL newb,所以也许你们可以帮助我理解一些东西,并可能帮助解决我认为必须的一个简单问题。SQL Select Statement每个供应商子查询的最大付款日期

我运行这个查询,它返回我想要的结果,并觉得是正确的。

SELECT distinct 
    isnull(T3.[name],'') [Vendor Name] 
    ,T1.[active] [Active] 
    ,T1.[number] [Vendor Number] 
    ,T1.[mnemonic] [Mnemonic] 
    ,T1.[bank_acc] [Bank Account] 
    ,isnull(T1.[our_acct_number],'') [Our Account Number] 
    ,isnull(T1.[fed_id_num],'') [Fed ID] 
    ,isnull((select T2.[ap_contact_name] [AP Contact] from TABLE2 T2 
    where [ap_contact] = '1' and T2.[number] = T1.[number]),'') [AP Contact] 
    ,isnull(T2.[ap_contact_phone],'') [Contact Phone Number] 
    ,isnull(T1.[print_1099],'') [Print 1099?] 
    ,isnull(T1.[expense_type],'') [Expense Type] 
    ,isnull(T4.[remit_addr_1],'') [Remit Street Address] 
    ,isnull(T4.[remit_addr_2],'') [Other Adress Info] 
    ,isnull(T4.[remit_addr_3],'') [Remit City, State, Zip] 
    ,isnull(T4.[remit_1099], '') [Remit 1099?] 


FROM 
TABLE1 T1 
LEFT outer JOIN 
TABLE2 T2 
ON T1.[number] = T2.[number] 
left outer join 
TABLE3 T3 
ON T1.[number] = T3.[number] 
left outer join 
TABLE4 T4 
on T1.[number] = T4.[number] 
left join 
TABLE5 T5 
ON T1.[number] = T5.[txn_vendor] 
LEFT join 
TABLE6 T6 
ON T5.[txn_inv_num] = T6.[inv_num] 


WHERE 
T1.[active] ='Y' 

order by 
[Vendor Name] 

然而,当我这样子查询添加到select语句返回最后一个付息日为每个供应商

,(SELECT 
       MAX(T6.[inv_date]) 
       FROM 
       Table6 T6 
       WHERE 

       T5.[txn_inv_num] = T6.[inv_num] 
       group by T5.[txn_vendor],T5.[txn_inv_num] 
       ) 
       [Last Pymt Date] 

我得到约20行重复的供应商和不同日期的结果。我正在尝试将每个供应商的上次付款日期添加到结果集中。

我也尝试过使用其他方式的虚拟表,但我没有运气。任何输入赞赏。

使用SQL Server 2008

+0

你能尝试删除',T5 [txn_inv_num]'从'GROUP BY' – paul 2013-04-26 15:12:43

+0

得到相同不想要的结果(太多的记录,重复的供应商)。 (还是)感谢你的建议。 – 2013-04-26 15:15:26

+0

当你自己运行子查询时(当where子句被删除)时,你会得到什么? – paul 2013-04-26 15:18:30

回答

1

而不是使用distinct使用group by。这是一个版本的查询,只是改变了distinctgroup by和日期添加max()

SELECT distinct 
    isnull(T3.[name],'') [Vendor Name] 
    ,T1.[active] [Active] 
    ,T1.[number] [Vendor Number] 
    ,T1.[mnemonic] [Mnemonic] 
    ,T1.[bank_acc] [Bank Account] 
    ,isnull(T1.[our_acct_number],'') [Our Account Number] 
    ,isnull(T1.[fed_id_num],'') [Fed ID] 
    ,isnull((select T2.[ap_contact_name] [AP Contact] from TABLE2 T2 
    where [ap_contact] = '1' and T2.[number] = T1.[number]),'') [AP Contact] 
    ,isnull(T2.[ap_contact_phone],'') [Contact Phone Number] 
    ,isnull(T1.[print_1099],'') [Print 1099?] 
    ,isnull(T1.[expense_type],'') [Expense Type] 
    ,isnull(T4.[remit_addr_1],'') [Remit Street Address] 
    ,isnull(T4.[remit_addr_2],'') [Other Adress Info] 
    ,isnull(T4.[remit_addr_3],'') [Remit City, State, Zip] 
    ,isnull(T4.[remit_1099], '') [Remit 1099?], 
    max(t6.inv_date) as [Last Pymt Date] 


FROM 
TABLE1 T1 
LEFT outer JOIN 
TABLE2 T2 
ON T1.[number] = T2.[number] 
left outer join 
TABLE3 T3 
ON T1.[number] = T3.[number] 
left outer join 
TABLE4 T4 
on T1.[number] = T4.[number] 
left join 
TABLE5 T5 
ON T1.[number] = T5.[txn_vendor] 
LEFT join 
TABLE6 T6 
ON T5.[txn_inv_num] = T6.[inv_num] 


WHERE 
T1.[active] ='Y' 

group by 
    isnull(T3.[name],'') [Vendor Name] 
    ,T1.[active] [Active] 
    ,T1.[number] [Vendor Number] 
    ,T1.[mnemonic] [Mnemonic] 
    ,T1.[bank_acc] [Bank Account] 
    ,isnull(T1.[our_acct_number],'') [Our Account Number] 
    ,isnull(T1.[fed_id_num],'') [Fed ID] 
    ,isnull((select T2.[ap_contact_name] [AP Contact] from TABLE2 T2 
    where [ap_contact] = '1' and T2.[number] = T1.[number]),'') [AP Contact] 
    ,isnull(T2.[ap_contact_phone],'') [Contact Phone Number] 
    ,isnull(T1.[print_1099],'') [Print 1099?] 
    ,isnull(T1.[expense_type],'') [Expense Type] 
    ,isnull(T4.[remit_addr_1],'') [Remit Street Address] 
    ,isnull(T4.[remit_addr_2],'') [Other Adress Info] 
    ,isnull(T4.[remit_addr_3],'') [Remit City, State, Zip] 
    ,isnull(T4.[remit_1099], '') [Remit 1099?] 


order by 
[Vendor Name] 
+0

哇,这很容易。谢谢你的帮助! – 2013-04-26 15:31:00