具有不同条件的SQL列子查询

具有不同条件的SQL列子查询,sql,join,subquery,Sql,Join,Subquery,假设a有两个表,[Products]和[Quantiy] 我需要在两者中选择一个联接,以便构建一个包含每个产品的总数量的表。 我知道谁可以在香草酒会上这样做。我的问题是,我需要3列,第一列为[PreviewTotal],其中我应该有从昨天开始到现在的总数量,而不管数量的符号,其他的[TodaytotalPos]有今天的数量和正数,其他的[TodaytotalNeg]只有今天和负数 结果如下: [Products] [PreviewTotal] [TodaytotalPos] [Todaytot

假设a有两个表,[Products]和[Quantiy]

我需要在两者中选择一个联接,以便构建一个包含每个产品的总数量的表。 我知道谁可以在香草酒会上这样做。我的问题是,我需要3列,第一列为[PreviewTotal],其中我应该有从昨天开始到现在的总数量,而不管数量的符号,其他的[TodaytotalPos]有今天的数量和正数,其他的[TodaytotalNeg]只有今天和负数

结果如下:

[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,默认情况下它不包括行。