2012-04-25 10 views
0

私はデータを取得するために必要な3つのテーブルを持っていますが、左側のテーブルは常に "どこ"で呼び出された行を表示する必要があります。私の問題は、3つのテーブルがあるので、これを動作させることができないということです。私は狂気のような結合を試みましたが、2つのテーブルだけを扱うときには機能しますが、3つ目のテーブルを取得するとすぐに機能しません。3つのテーブル全体でNULLでない行しか表示されません。他の2つのテーブルが指定されたIDに対して完全にヌルであるかどうかにかかわらず、指定したIDを最初のテーブルに表示できるようにする必要があります1つのクエリ、3つのテーブル、すべての行を左側のテーブルに表示しますか?

私は読み取りアクセスしかないので、仕事。以下は、指定された日のデータがないために表示されないIDがあることを除いて、私が望むデータを取得するためのものであるとして機能するSQLコードです。

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 

構造を説明するために、[ユーザー]テーブルには、ユーザーのID番号を表示し、名前は、SalesOrderJournalDetailテーブルには、当日の売上高を表示し、UserTotalテーブルは(いくつかの計算を経て)月次売上データが表示されます。

後者の2つのテーブルから1日の売上と月間売上を表示する必要があり、最初のユーザーの名前とIDを取得する必要があります。

すべての3つのテーブルのユニークなデータは、[ユーザー]です.ID、SalesJournalDetail.SalesPersonUserId、およびUserTotal.UserId

何がある場合、私は、これは、すべてのIDがどこに示しています表示するために取得することができますどのように任意のアイデアは関係なく、cluaseませんそのユーザーの日または月間売上高は?

ああ、これは、Microsoft SQLに

感謝を使用しています!

答えて

1

構造を使用してテーブルを作成しました。非常に小さな列名の変更があります。それに応じて変更してください。 ActualCostは私のテーブルのActualPriceです。あなたのSalesOrderJournalTableでSalesUserテーブルをジョイン:後

は、クエリ、それは サブクエリSOJDALLUSERS仕組み

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 


) 

になります。すべてのユーザーのデータを取得します

サブクエリ:UserTotalテーブルを持つSalesUserテーブルを結合します。すべてのユーザーのデータを取得します。私が間違っていない場合は、SalesMTDとCostMTDはすべてのユーザーの "SUM"になるはずです。あなたはそれを見逃しました。

上記の2つの結果は、すべてのユーザーの詳細を取得するために内部結合されています。上記の副問合せはsales表の各ユーザーのデータを取り込むため、上記の2つの副問合せの内部結合により、データが欠落している場合は常に適切なNULL値を持つすべてのユーザーのデータが保証されます。

私はテーブルを作成し、salestotalテーブルにユーザーのための次のシナリオのユーザーのための雑誌とsalestotalテーブルの両方で 1.データジャーナルテーブルではなく、salestotalテーブル内の 2.データ 3.データをチェックしなくてきましたユーザーのジャーナルテーブルに保存します。

IT WORKS ..それはあなたの問題にいくつかの方向性を与えた場合、あなたの参照のための答えとしてTable schema for your reference

マークを

テーブルスキーマをお楽しみください。

+0

私が期待していたよりもはるかに徹底した答えです:)しかし、SQL Management StudioをテストするためにSQL Management Studioに貼り付けると、動作しないようです。私は "無効なオブジェクト名 'SalesUser'を取得します。"エラー。私は "ActualPrice"を "ActualCost"に戻して自分のデータベースとマッチさせましたが、変更が必要なものがあるかどうかは確信していませんか?申し訳ありませんが、私は非常にSQLに新しいです。ありがとうございました! – BlueCaret

+0

私のテーブル名は[SalesUser]で、あなたのテーブル名は[User]です。あなたはその変更を行う必要がある場合はテーブルスキーマと一致する必要があります...それはテーブル、上記のクエリを実行しました..オブジェクト名、つまりテーブル名とカラム名がテーブルに一致することを確認してください。 –

+0

できます!どうもありがとうございます!私は1週間このことを理解しようとしてきましたが、現在のクエリが何であるかに基づいて、私は近くにいませんでした:) – BlueCaret

関連する問題