Sql 连接两个表,这样我就可以得到所有日期的所有项目

Sql 连接两个表,这样我就可以得到所有日期的所有项目,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有两张桌子:购买和物品。对于Purchase表中的每个日期,我希望看到items表中每个项目的购买数量。下面是我希望从我的查询中得到的结果集。问题是,如果某一天没有购买任何物品,那么在采购表中就没有相关记录。日期必须来自采购表(无连续日期) 您可以从Purchase表交叉连接一组不同的日期,以获得日期列表。仅当在特定日期至少购买了一件物品时,才会返回日期: SELECT dt.PurchaseDate, i.Value as ItemName, SUM(ISNULL(Quantity,0))

我有两张桌子:购买和物品。对于Purchase表中的每个日期,我希望看到items表中每个项目的购买数量。下面是我希望从我的查询中得到的结果集。问题是,如果某一天没有购买任何物品,那么在采购表中就没有相关记录。日期必须来自采购表(无连续日期)


您可以从Purchase表交叉连接一组不同的日期,以获得日期列表。仅当在特定日期至少购买了一件物品时,才会返回日期:

SELECT
 dt.PurchaseDate, i.Value as ItemName, SUM(ISNULL(Quantity,0)) as Quantity
FROM Items i
CROSS JOIN ( SELECT DISTINCT PurchaseDate FROM Purchase ) dt
LEFT OUTER JOIN Purchase p
  ON i.Value = p.ItemName
  AND dt.PurchaseDate = p.PurchaseDate
GROUP BY dt.PurchaseDate, i.Value
ORDER BY dt.PurchaseDate, i.Value

您可以从Purchase表交叉连接一组不同的日期,以获得日期列表。仅当在特定日期至少购买了一件物品时,才会返回日期:

SELECT
 dt.PurchaseDate, i.Value as ItemName, SUM(ISNULL(Quantity,0)) as Quantity
FROM Items i
CROSS JOIN ( SELECT DISTINCT PurchaseDate FROM Purchase ) dt
LEFT OUTER JOIN Purchase p
  ON i.Value = p.ItemName
  AND dt.PurchaseDate = p.PurchaseDate
GROUP BY dt.PurchaseDate, i.Value
ORDER BY dt.PurchaseDate, i.Value

除非您有一个包含所有日历日期的表,或者使用光标方法,否则您将无法填充没有购买任何东西的日期。

除非您有一个包含所有日历日期的表,或者使用光标方法,您将无法填充未购买任何东西的日期。

我不明白这些行中的日期来自何处。它们来自购买表。但它们不存在于该表中!我不明白这些行中的日期是从哪里来的。它们来自采购表。但它们不存在于该表中!您在哪里购买?我想你的意思是
PurchaseDate
。您还需要排序。谢谢@njk。。。我在回答中已经解决了这个问题。您从哪里获得PurchaseDt?我想你的意思是
PurchaseDate
。您还需要排序。谢谢@njk。。。我在回答中已经解决了这个问题。
select
    p.purchasedate,
    i.value,
    sum(case when p.itemname = i.value then p.quantity else 0 end)
from
    Purchase p
    cross join Items i
group by
    p.purchasedate,
    i.value
order by
    p.purchasedate, 
    i.value
select
    p.purchasedate,
    i.value,
    sum(case when p.itemname = i.value then p.quantity else 0 end)
from
    Purchase p
    cross join Items i
group by
    p.purchasedate,
    i.value
order by
    p.purchasedate, 
    i.value