一个查询,三个表,显示左表中的所有行?

时间:2012-04-25 05:23:14

标签: sql join

我需要三个表来提取数据,左表需要始终显示在“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

为了帮助解释结构,[User]表显示用户的ID号和Name,SalesOrderJournalDetail表显示当天的销售额,UserTotal表显示月销售数据(通过一些计算)。

我需要从后两个表中显示当天的销售额和月度销售额,并且需要从第一个表中提取用户的名称和ID。

所有三个表的唯一数据是[User] .Id,SalesJournalDetail.SalesPersonUserId和UserTotal.UserId

我是否有任何想法如何显示所有ID显示在哪里cluase,无论该用户没有日期或月度销售?

哦,这是使用Microsoft SQL

1 个答案:

答案 0 :(得分: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”。你错过了它。

以上两个结果是内部联接以获取每个用户的详细信息。由于上面的子查询为sales表中的每个用户提供了数据,因此上述两个子查询的内部联接将保证所有用户的数据在缺少数据时具有适当的空值。

我创建了表格并检查了以下场景 1.用户的日记帐和销售表中的数据 2.日记帐表中的数据,但不是用户的salestotal表中的数据 3. salestotal表中的数据,但不包含在用户的日记帐表中。

IT工作..享受

您的参考Table schema for your reference

的表架构

如果它能为您提供问题的方向,请标记为答案。这个查询是一个很好的挑战..