具有不同条件的SQL列子查询
假设a有两个表,[Products]和[Quantiy] 我需要在两者中选择一个联接,以便构建一个包含每个产品的总数量的表。 我知道谁可以在香草酒会上这样做。我的问题是,我需要3列,第一列为[PreviewTotal],其中我应该有从昨天开始到现在的总数量,而不管数量的符号,其他的[TodaytotalPos]有今天的数量和正数,其他的[TodaytotalNeg]只有今天和负数 结果如下:具有不同条件的SQL列子查询,sql,join,subquery,Sql,Join,Subquery,假设a有两个表,[Products]和[Quantiy] 我需要在两者中选择一个联接,以便构建一个包含每个产品的总数量的表。 我知道谁可以在香草酒会上这样做。我的问题是,我需要3列,第一列为[PreviewTotal],其中我应该有从昨天开始到现在的总数量,而不管数量的符号,其他的[TodaytotalPos]有今天的数量和正数,其他的[TodaytotalNeg]只有今天和负数 结果如下: [Products] [PreviewTotal] [TodaytotalPos] [Todaytot
[Products] [PreviewTotal] [TodaytotalPos] [TodaytotalNeg]
AAPL 20,000 500 -700
MCD 15,000 NULL -300
BAC -30,000 2,000 NULL
结构示例:
产品:
[id] [name]
1 AAPL
2 MCD
3 BAC
数量:
[date] [Id_Product] [Quantity]
12/16 1 500
12/16 2 -300
12/17 1 1,000
12/18 3 5,500
12/18 1 -2,000
根据您指定的规则,我认为您只是在寻找条件聚合。您的查询如下所示:
select p.name,
sum(case when [date] < cast(getdate() as date) then quantity end) as PreviewTotal,
sum(case when [date] = cast(getdate() as date) and quantity > 0
then quantity end) as TodayTotalPos,
sum(case when [date] = cast(getdate() as date) and
quantity < 0 then quantity end) as TodayTotNeg
from products p join
quantity q
on q.id_product = p.id
group by p.name
order by p.name;
但是,根据这些规则,您所需的结果与输入数据不匹配。在SQL Server中,如果条件为真或假,您可以使用CASE选择字段值。我假设您的[Products]表至少包含ProductId和ProductName,而[Quantity]表至少包含ProductId、Qty和SoldDate
-- get the time of midnight, the start of today:
DECLARE Today datetime;
SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()), '19000101') INTO Today
-- get the totals
SELECT Products.ProductName,
SUM(
CASE
WHEN Quantity.SoldDate >= Today THEN Quantity.Qty
ELSE 0
END) AS PreviewTotal,
SUM(
CASE
WHEN Quantity.Qty> 0 AND Quantity.SoldDate >= Today) THEN Quantity.Qty
ELSE 0
END) AS TodaytotalPos,
SUM(
CASE
WHEN Quantity.Qty< 0 AND Quantity.SoldDate >= Today THEN Quantity.Qty
ELSE 0
END) AS TodaytotalNeg
FROM Products JOIN Quantity on Products.ProductId = Quantity.ProductId
GROUP BY ProductName
您能提供产品和数量的表结构吗?提供一些示例数据,并从中获得所需的输出…您使用的是什么数据库?SQL Server 2014 Express根据您指定的规则,您所需的结果与输入的数据不匹配。工作正常,谢谢。还有一件事,这个选择是连接的一部分。最后,如果这3个计算列都为空,我不想显示一行。因为我使用的是SELECT/JOIN,所以我想我必须使用HAVING,但它没有将这3列识别为参数。忽略,只是意识到如果all为NULL,默认情况下它不包括行。