2013-11-03 45 views
-2

我有2個表。只有這3個記錄持有日期類別(如下所示DIS.csv)。另一個包含我想返回的財務數據(VAU.csv)。MS查詢SQL語句有2個表和3個記錄

VAU.csv 
ID WORDING 
1  30 - 59 Days 
2  60 - 89 Days 
3  90+ Days 

我想即使60 - 590總是返回3條記錄。如果只找到1條記錄,下面的SQL語句只返回1行。如果需要,我希望所有3行都返回填充計數爲0和值爲0。

SELECT DIS.DISWORDING, 
     Count(VAU.ITEM), 
     Sum(VAU.VALUE) 

FROM DIS.csv DIS 
     LEFT JOIN VAU.csv VAU ON DIS.ID = VAU.ID 

WHERE VAU.TYPE = 'TRADE' 

GROUP BY DIS.DISWORDING 

回答

1

http://sqlfiddle.com/#!2/d005f/16/0

我修改的表名的SQL小提琴。我想我把它們改回正確....

select dis.diswording, 
     count(vau.item) as item_count, 
     coalesce(sum(vau.value),0) as value_sum 

from dis.csv as dis 

     left join vau.csv as vau 
      on dis.id = vau.id and vau.type = 'trade' 

group by dis.diswording; 

你幾乎沒有錯。 type='trade'的條件需要發生在join聲明中,而不是在where中發生。 left outer join表示您希望dis.csv中的所有行以及它們匹配的vau.csv中的僅有行。我花了一分鐘的時間才弄明白,但是有type='trade'在哪裏導致一些數據丟失。

你也可以認爲它是這樣的:

select dis.diswording, 
     count(vau.item) as item_count, 
     coalesce(sum(vau.value),0) as value_sum 

from dis.csv as dis 

     left join (select * 
        from vau.csv 
        where vau.type = 'trade') as vau 
      on dis.id = vau.id 

group by dis.diswording; 

編輯
相反的coalesce(sum(vau.value),0) as value_sum你可以嘗試:
Nz(sum(vau.value),0) as value_sum

  • 告訴我你的準確和完整錯誤請(您可以更新問題)。有幾種方法可以重新編寫查詢,因此我確定可以將其切換爲可接受的內容。 Jet/Excel/Office有點怪異和敏感。我沒有任何方法可以在我將它們提供給您之前在您的實際環境中測試這些查詢。

我不確定數據庫有問題的部分查詢。這也適用於:
嘗試更換用的Nz

select dis.diswording, 
     sum(case when vau.type='trade' 
        then 1 else 0 end) as item_count, 
     coalesce(sum(case when vau.type='trade' 
          then vau.value 
          else 0 end),0) as value_sum 

from dis.csv as dis 

     left join vau.csv as vau 
      on dis.id = vau.id 

group by dis.diswording; 

凝聚你可以嘗試排除故障就看什麼查詢的一部分,它給出了一般性錯誤的呢?只需通過刪除部件就可以儘可能簡化查詢...然後添加內容。請參閱是否可以隔離問題。

  1. 這是否運行? (請嘗試最基本的形式)

    select dis.id, dis.diswording, 
          vau.item, vau.value, vau.type 
    
        from dis.csv as dis 
    
          left join vau.csv as vau 
          on dis.id = vau.id 
    
  2. 這是否運行? (嘗試在連接中過濾交易)

    select dis.id, dis.diswording, 
          vau.item, vau.value, vau.type 
    
        from dis.csv as dis 
    
          left join vau.csv as vau 
          on dis.id = vau.id and vau.type='trade' 
    
  3. 這是否運行?(嘗試嵌套選擇)

    select dis.id, dis.diswording, 
          vau.item, vau.value, vau.type 
    
        from dis.csv as dis 
    
          left join (select * from vau.csv where type='trade') as vau 
          on dis.id = vau.id 
    
  4. 這是否運行? (假設#1的工作,添加和/數到一個可行的查詢)

    select dis.id, dis.diswording, 
          count(vau.item) as item_count, 
          sum(vau.value) as vaue_sum 
    
        from dis.csv as dis 
    
          left join vau.csv as vau 
          on dis.id = vau.id 
    
        group by dis.id, dis.diswording 
    

而只保留要去看看是什麼問題...慢慢積聚到你想要查詢使用。一般錯誤意味着我們試圖做一些數據庫不支持的事情。使用不存在的函數可能會是一個語法錯誤。

+0

您好,我真的很感謝您花時間看我的查詢。我已經嘗試過你的建議。我要麼得到一個語法錯誤或一般的ODBC錯誤。我對你的例子進行了一些改變,發現MSQuery似乎不喜歡Coalesce功能,在我發現有一個替代ISNULL,但它仍然不喜歡(Syntax Error)。你給的第二個例子返回了「General ODBC Error」,如果我從第二個例子中取出Where子句,它沒有錯誤地運行,但當然只返回一行。 –

+0

您是否認爲我正在嘗試使用MSQuery(將數據加載到Excel中)實現一些不可能的事情。雖然它看起來確實是一個相當基本的要求,所以我認爲MSQuery會取決於它?再次感謝,我真的很感謝人們給予的任何幫助。 –

+0

告訴我確切的錯誤是什麼,請...我不認爲這是不可能的,MS辦公室的東西有點奇怪,但總是有工作。不過,我沒有實際測試任何實際環境的能力。我用'coalesce'給我一個0而不是空的空字段。看看查詢是否運行沒有。如果這是唯一的問題,我相信我們可以找到另一種方式來獲得零。 –

0

非常感謝您的幫助,在逐步完成您給出的每一步之後,我已經在MSQuery中計算出您必須使用IIF語句,從而生成以下代碼。我將TYPE改爲CHASSIS和VALUE爲SIV,但只是爲了使數據庫更易於閱讀。再次,我真的很感謝像你這樣幫助陌生人的人,因爲這很容易點擊下一頁。 (VAU.SCH)是NULL,0,SUM(VAU.SIV))從DIS.csv作爲總和DIS DIS LEFT JOIN(SELECT *)選擇DIS.DISWORDING,COUNT(VAU.CHASSIS),IIF(SUM(VAU.SIV)是NULL,0,SUM(VAU.SIV) FROM VAU.csv AS VAU WHERE VAU.VEHICLETYPE ='TRADE')AS VAU ON DIS.DISID = VAU.DISID GROUP BY DIS.DISID,DIS.DISWORDING「

BTW剛剛閱讀您的主頁,真的很抱歉聽到近期事件。保持領先的遊戲,併爲你身邊所有...乾杯