0

我需要为三个表提取数据,左表需要始终显示在“位置”中调用的行。我的问题是,由于有三张桌子,我无法让它工作。我已经疯狂地尝试连接,它只在做两个表时有效,但是一旦我得到第三个它就不起作用,它只会显示所有三个表中不为空的行。我需要能够在第一个表中显示指定的 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 号和名称,SalesOrderJournalDetail 表显示当天的销售额,UserTotal 表显示每月的销售额数据(通过一些计算)。

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

这三个表的唯一数据是 [User].Id、SalesJournalDetail.SalesPersonUserId 和 UserTotal.UserId

无论该用户是否没有日销售额或月销售额,我有什么想法可以让它显示 where cluase 中显示的所有 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 应该是每个用户的“总和”。你错过了。

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

我已经创建了表格并检查了以下场景 1. 用户的 journal 和 salestotal 表中的数据 2. journal 表中的数据,但用户的 salestotal 表中的数据 3. salestotal 表中的数据,但用户的 journal 表中的数据。

它工作..享受

表架构供您参考表架构供您参考

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

于 2012-04-25T06:58:40.290 回答