2012-04-25 47 views
0

我有三張我需要拉數據的表,左表需要始終顯示在「where」中調出的行。我的問題是,因爲有三張桌子我無法得到這個工作。我嘗試了一些瘋狂的連接,它只在執行兩個表時工作,但是一旦我得到第三個表時它不起作用,那麼它將只顯示在所有三個表中都不爲空的行。我需要能夠在第一個表中顯示指定的ID,而不管另外兩個表對於指定的ID是否完全爲空一個查詢,三個表,顯示左表中的所有行?

我有一個數據庫,我只有讀取權限,所以更改結構就贏了'工作。下面是我的SQL代碼,它的作用就像獲取我想要的數據一樣,但有一個ID由於在指定的日期沒有數據而無法顯示。

select 
    [User].Id, 
    [User].Name, 
    convert(float,round(sum(SalesOrderJournalDetail.Price*SalesOrderJournalDetail.Shipped),2)) as 'Sales Yesterday', 
    convert(float,round(sum(SalesOrderJournalDetail.ActualCost*SalesOrderJournalDetail.Shipped),2)) as 'Cost Yesterday', 
    count(distinct(SalesOrderJournalDetail.SalesOrderId)) as 'Orders Yesterday', 
    count(SalesOrderJournalDetail.SalesOrderId) as 'Lines Yesterday', 
    convert(float,UserTotal.SalesMTD,2) as 'Sales MTD', 
    round(convert(float,UserTotal.CostMTD,2),2) as 'Cost MTD' 
from 
    [User], UserTotal, SalesOrderJournalDetail 
where 
    [User].Id in (' 725',' 150',' 239',' 225',' 209',' 227',' 222',' 232',' 241',' 215',' 214',' 722',' 134',' 201',' 238',' 721','M104',' 244',' 245',' 104') 
and convert(varchar(10),SalesOrderJournalDetail.InvoiceDate,111) = '2012/04/19' 
    and [User].Id=SalesOrderJournalDetail.SalesPersonUserId 
    and SalesOrderJournalDetail.SalesPersonUserId=UserTotal.UserId 
group by [User].Id, [User].Name, SalesOrderJournalDetail.SalesPersonUserId, UserTotal.UserId, UserTotal.SalesMTD, UserTotal.CostMTD 
order by [User].Name 

幫助解釋結構,[用戶]表顯示該用戶的身份證號和姓名,該SalesOrderJournalDetail表顯示當天的銷售情況,以及UserTotal表顯示的每月銷售數據(通過一些計算)。

我需要從後兩個表中顯示當天的銷售額和月銷售額,並且需要從第一個表中提取用戶的名稱和ID。

所有這三個表的唯一數據是[用戶] .ID,SalesJournalDetail.SalesPersonUserId和UserTotal.UserId

任何想法如何,我能得到這個顯示所有的ID顯示在哪裏,無論cluase如果沒有該用戶的一天或每月的銷售額?

哦,這是使用Microsoft SQL

謝謝!

回答

1

用你的結構創建表。非常小的名稱更改就在那裏。請相應改變。 ActualCost在我的表中是ActualPrice。

下面將要查詢

SELECT 
    ISNULL(SalesJournalUserId,TotalSalesUserId) AS UserId, 
    ISNULL(SalesJournalUserName,TotalSalesUserName) AS UserName, 
    [Orders Yesterday], 
    [Lines Yesterday], 
    [Sales Yesterday], 
    [Cost Yesterday], 
    [Sales MTD], 
    [Cost MTD] FROM 
(
    (
    SELECT 
     SalesUser.Id as SalesJournalUserId, 
     SalesUser.Name as SalesJournalUserName, 
     [Orders Yesterday], 
     [Lines Yesterday], 
     [Sales Yesterday], 
     [Cost Yesterday] 

    FROM 
     [SalesUser] 
    LEFT JOIN 
    (
     select 
      [User].Id, 
      [User].Name, 
      Count(distinct(SalesOrderJournalDetail.ID)) as 'Orders Yesterday', 
      Count((SalesOrderJournalDetail.ID)) as 'Lines Yesterday', 
      convert(float,round(sum(SalesOrderJournalDetail.Price*SalesOrderJournalDetail.Shipped),2)) as 'Sales Yesterday', 
      convert(float,round(sum(SalesOrderJournalDetail.ActualPrice*SalesOrderJournalDetail.Shipped),2)) as 'Cost Yesterday' 
     from 
      [SalesUser] as [User] 
     LEFT JOIN SalesOrderJournalDetail 
     on [User].Id = SalesOrderJournalDetail.SalesPersonUserId  
     where 
     --[User].Id =1 and 
     convert(varchar(10),SalesOrderJournalDetail.InvoiceDate,111) = '2012/04/19' 
     group by [User].Id,[user].Name 
    ) SOJD 

    ON SalesUser.Id = SOJD.ID 
    ) SOJDALLUSERS 

INNER JOIN 
    (
    SELECT 
     SalesUser.Id as TotalSalesUserId, 
     SalesUser.Name as TotalSalesUserName, 
     [Sales MTD], 
     [Cost MTD] 
    FROM 
     [SalesUser] 

    LEFT JOIN 
    (
     select 
     [User].Id, 
     [User].Name, 
     convert(float,sum(UserTotal.SalesMTD),2) as 'Sales MTD', 
     round(convert(float,sum(UserTotal.CostMTD),2),2) as 'Cost MTD' 
     from 
     [SalesUser] as [User] 
     LEFT JOIN UserTotal 
     on [User].Id = UserTotal.UserId  
     --where 
     --[User].Id =1  
     group by [User].Id,[User].name 
    ) AS SOUT 
    ON SalesUser.Id = SOUT.ID 
    ) SOUTALLUSERS 

    ON SOJDALLUsers.SalesJournalUserId = SOUTALLUSERS.TotalSalesUserId 


) 

它是如何工作 子查詢SOJDALLUSERS:加入你的SalesOrderJournalTable SalesUser表。爲每個用戶提取數據

子查詢SOUT:使用UserTotal表連接SalesUser表。爲每個用戶提取數據。如果我沒有錯,您的SalesMTD和CostMTD應該是每個用戶的「SUM」。你錯過了它。

以上兩個結果是內部加入以獲取每個用戶的詳細信息。由於上述子查詢爲銷售表中的每個用戶帶來數據,因此,上述兩個子查詢的內部聯接將保證數據缺失時適用於具有適當空值的所有用戶的數據。

我已經創建的表,並檢查下列情況下,在這兩個期刊和salestotal表 1.數據的用戶日誌表 2.數據,但不能在salestotal表用戶 3.數據salestotal表但不在用戶的日記表中。

IT WORKS ..享受

表模式供您參考Table schema for your reference

標記爲答案,如果它給你一些指導您的問題。這是一個很好的挑戰做這個查詢..

+0

非常感謝你,非常徹底的答案比我的預期:)然而,它似乎並沒有工作時,我堅持到SQL管理Studio來測試它。我得到一個「無效的對象名'SalesUser'。」錯誤。我將「ActualPrice」改回「ActualCost」以匹配我的數據庫,但我不確定是否還有其他人需要更改?對不起,我對SQL很陌生。謝謝! – BlueCaret 2012-04-25 16:43:59

+0

我的表名是[SalesUser],你的表名是[User] ..你需要進行更改,如果需要的話,以匹配你的表模式...它應該工作,因爲我已經創建了表,插入數據和運行上述查詢..只要確保對象名稱,即表和列名稱匹配您的表.. – 2012-04-26 04:05:05

+0

明白了!有用!非常感謝!我一直試圖找出這一個星期,並基於現在的查詢,我沒有在哪裏關閉:) – BlueCaret 2012-04-26 04:25:08