0

データを取得する必要がある 3 つのテーブルがあります。左側のテーブルには、「where」で呼び出される行を常に表示する必要があります。私の問題は、3 つのテーブルがあるため、これを機能させることができないことです。私は狂ったように結合を試みました.2つのテーブルのみを実行すると機能しますが、3番目のテーブルを取得するとすぐに機能しなくなり、3つのテーブルすべてでnullではない行のみが表示されます. 指定された ID に対して他の 2 つのテーブルが完全に null であるかどうかに関係なく、最初のテーブルに指定された ID を表示できるようにする必要があります。

読み取りアクセスしかできないデータベースがあるため、この構造を変更しても機能しません。以下は、指定された日のデータがないために表示されない 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

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

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

3 つのテーブルの一意のデータはすべて、[User].Id、SalesJournalDetail.SalesPersonUserId、および UserTotal.UserId です。

そのユーザーの日単位または月単位の売上がない場合でも、where 句に表示されるすべての ID を表示する方法はありますか?

ああ、これはMicrosoft SQLを使用しています

4

1 に答える 1

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: SalesUser テーブルを SalesOrderJournalTable と結合します。すべてのユーザーのデータを取得します

サブクエリ SOUT : SalesUser テーブルと UserTotal テーブルを結合します。すべてのユーザーのデータをフェッチします。私が間違っていなければ、SalesMTD と CostMTD はすべてのユーザーの「SUM」である必要があります。あなたはそれを逃しました。

上記の 2 つの結果は、すべてのユーザーの詳細を取得するために内部結合されています。上記のサブクエリは sales テーブルのすべてのユーザーのデータを取得するため、上記の 2 つのサブクエリの内部結合により、データが欠落している場合は常に適切な null 値を持つすべてのユーザーのデータが保証されます。

私はテーブルを作成し、次のシナリオを確認しました。

それは機能します..お楽しみください

参照用のテーブル スキーマ参照用のテーブル スキーマ

問題の方向性がわかる場合は、回答としてマークしてください。このクエリを実行するのは素晴らしい挑戦でした..

于 2012-04-25T06:58:40.290 に答える