如何在 SQL SERVER 中加入我的条件?
Posted
技术标签:
【中文标题】如何在 SQL SERVER 中加入我的条件?【英文标题】:How to make joins in my criteria in SQL SERVER? 【发布时间】:2017-06-20 11:24:30 【问题描述】:我有三张桌子:
**1.FT_ViewItemMovement **
StoreID ItemLookupCode QTY
-------------------------------
1001 11121111 222
1001 11121111 1
1201 11121111 333
1201 11121111 2
2.项目
ItemLookupCode ID
------------------------
11121111 111
3.ItemDynamic
ItemID StoreID SnapShotQuantity
-------------------------------------
111 1201 50
111 1001 25
111 5000 75
111 7777 100
期待结果
ItemID StoreID QTY SnapShotQuantity
-------------------------------------
111 1201 335 50
111 1001 223 25
111 5000 0 75
111 7777 0 100
我尝试了以下查询,但没有得到
SELECT
ViewItemMovement.ItemLookupCode,
ViewItemMovement.StoreID,
Sum(ViewItemMovement.Quantity) Quantity,
ItemDynamic.SnapShotQuantity SanpShotQuantity
FROM
FT_ViewItemMovement ViewItemMovement
left join Item with(NoLock) on Item.ItemLookupCode = ViewItemMovement.ItemLookupCode
left join ItemDynamic with(NoLock) on ItemDynamic.ItemID = Item.ID and ItemDynamic.StoreID = ViewItemMovement.StoreID
WHERE brand = 'PEPSI'
Group By
ViewItemMovement.ItemLookupCode,
ViewItemMovement.StoreID,
ViewItemMovement.ItemDescription,
ViewItemMovement.Brand,
Item.Cost,
ItemDynamic.SnapShotQuantity
首先我想通过 StoreID 和 ItemLookupCode 来总结
FT_ViewItemMovement.Qty
的数量,然后如果它与 ItemDynamic 匹配相同的 itemID,它必须带上SnapShotQuanity
如果没有
FT_ViewItemMovement.Qty
,则将FT_ViewItemMovement.Qty = 0
显示为预期输出
【问题讨论】:
【参考方案1】:通过查看您需要的内容来简化查询,即两个SUM
和一个包含其他选择的GROUP BY
,同时使用FT_ViewItemMovement
中的StoreID
以允许SUM(v.QTY)
工作。
SELECT id.ItemID, v.StoreID, SUM(v.QTY), SUM(id.SnapShotQuantity)
FROM FT_ViewItemMovement v
INNER JOIN Item i ON v.ItemLookupCode = i.ItemLookupCode
INNER JOIN ItemDynamic id ON i.ID = id.ItemID
GROUP BY id.ItemID, v.StoreID
【讨论】:
【参考方案2】:您的GROUP BY
子句看起来太复杂了。我想这就是你想要的:
SELECT vim.ItemLookupCode, vim.StoreID,
COALESCE(Sum(vim.Quantity), 0) as Quantity,
id.SnapShotQuantity as SanpShotQuantity
FROM FT_ViewItemMovement vim LEFT JOIN
Item i
ON i.ItemLookupCode = vim.ItemLookupCode LEFT JOIN
ItemDynamic id
ON id.ItemID = i.ID and id.StoreID = vim.StoreID
WHERE vim.brand = 'PEPSI'
GROUP BY vim.ItemLookupCode, vim.StoreID,
id.SnapShotQuantity;
您的WHERE
子句引用brand
。根据您的问题,我不知道这是从哪里来的。
【讨论】:
它没有显示来自ItemDynamic.StoreID
的所有StoreID Snapshot
在 ItemDynamic 中,一个项目有 5 个 storeID 和 SnapShotQuantity
。但是在FT_ViewItemMovement
中,它只有 2 个 storeid 具有相同的项目。所以我想显示所有storeid的Itemlookupcode【参考方案3】:
对于您的数据样本,您必须从 ItemDynamic 中进行选择,然后使用连接其他表。 我希望它对你有用。
SELECT
ItemDynamic.ItemID,
ItemDynamic.StoreID,
SUM(ViewItemMovement.Quantity) AS Quantity,
MAX(ItemDynamic.SnapShotQuantity) AS SanpShotQuantity
FROM
ItemDynamic with(NoLock)
left join Item with(NoLock) on Item.ID = ItemDynamic.ItemID
left join FT_ViewItemMovement ViewItemMovement on ViewItemMovement.ItemLookupCode = Item.ItemLookupCode and ViewItemMovement.StoreID = ItemDynamic.StoreID
Group By
ItemDynamic.ItemID,
ItemDynamic.StoreID
【讨论】:
它没有从 ItemDynamic 带来所有 storeid以上是关于如何在 SQL SERVER 中加入我的条件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server Management Studio 中加入 3 列?