如何在 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 中加入两个查询的结果?

如何在 SQL Server Management Studio 中加入 3 列?

如何在 SQL Server 中加入数字

在sql server 数据库字段中如何加入回车符和换行符?

如何在oracle的sql语句中加入判断条件

如何在 SQL Server 2008 R2 中的 select 语句中编写条件