Sql 连接两个表,这样我就可以得到所有日期的所有项目
我有两张桌子:购买和物品。对于Purchase表中的每个日期,我希望看到items表中每个项目的购买数量。下面是我希望从我的查询中得到的结果集。问题是,如果某一天没有购买任何物品,那么在采购表中就没有相关记录。日期必须来自采购表(无连续日期)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表交叉连接一组不同的日期,以获得日期列表。仅当在特定日期至少购买了一件物品时,才会返回日期:
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