我需要三个表来提取数据,左表需要始终显示在“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
答案 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工作..享受
您的参考
的表架构如果它能为您提供问题的方向,请标记为答案。这个查询是一个很好的挑战..