SQL过滤数据

时间:2014-02-09 20:55:15

标签: sql tsql sql-server-2008-r2

我需要一些关于如何更有效地查询数据库的建议。

情况可以这样解释。如果客户进入商店并购买在[销售表]中创建销售的商品,则此表通过交易参考链接到[交易表],但可能会购买多个商品,每个商品在[产品表]。

除此之外,还有两个促销表,用于指示产品是在价格促销[促销]还是在多重促销[销售标志]上。这两个都链接回销售表。

我希望能够将所有行恢复,以便其中一个促销中的每笔交易都可用。

条件如下工作

    Product ¦    Price promo (promotions-promotion no) ¦Multibuy(salesflag-On promotion)
    -----------------------------------

    1.Product A                -1            0         = neither price promo nor multibuy 
    2.Product B                -1            1         = multibuy only ie 0 false 1 true
    3.Product C              8245            0         = price promo only can be any number other than -1

这是三种情况,但它们都可能在一次客户交易中发生。 那么,如果有产品B和C的情况,我如何检查每笔交易,如果存在,则返回整个篮子?

我所能想到的只是在where子句中进一步选择,但这将返回所有相关的交易号码,然后主查询将在整个数据库中搜索这些交易号码,这似乎是一个非常漫长的方式,因为它是我正在研究的一个巨大的数据库+我现在是相当基础的SQL。

SELECT 
TRANS.TransactionReference 
,TRANS.TID
,CONVERT(VARCHAR(10),T.Day,103) as 'Date'
,PROD.HierarchyLevel2
,PROD.HierarchyLevel3
,PROD.HierarchyLevel4
,PROD.ProductDescription
,PROD.ExternalProductCode
,PROD.Size
,CUST.CardNumber
,S.SalesQty /*unless Group everything somehow will get multiple lines per qty sold all with qty of 1*/
,S.SalesValue
,STOR.Area
,STOR.StoreCode
,STOR.StoreName

FROM Reporting.Sales as S
INNER JOIN Reporting.Products as PROD
on S.ProductID = PROD.ProductID
INNER JOIN Reporting.Time as T
on S.DateID = T.DateID
INNER JOIN Reporting.Stores as STOR
on S.StoreID = STOR.StoreID
INNER JOIN Reporting.Promotions as PROM
on S.PromotionID = PROM.PromotionID
INNER JOIN Reporting.SalesFlags as FLAG
on S.SalesFlagID = FLAG.SalesFlagID
INNER JOIN Reporting.Transactions as TRANS
on S.TID = TRANS.TID
INNER JOIN Reporting.Customers as CUST
on S.CustomerID = CUST.CustomerID

WHERE
T.Day BETWEEN '2014-01-23' and '2014-02-11'


    AND TRANS.TransactionReference IN(SELECT distinct TRANS.TransactionReference
    FROM Reporting.Sales as S
    INNER JOIN Reporting.Transactions as TRANS
    on S.TID = TRANS.TID
    INNER JOIN Reporting.Promotions as PROM
    on S.PromotionID = PROM.PromotionID
    INNER JOIN Reporting.SalesFlags as FLAG
    on S.SalesFlagID = FLAG.SalesFlagID
    INNER JOIN Reporting.Time as T
    on S.DateID = T.DateID
    WHERE
    PROM.PromotionNumber = '-1'
    AND FLAG.OnPromotion = 1)
    AND T.Day BETWEEN '2014-01-23' and '2014-02-11'

ORDER BY
TRANS.TransactionReference

上面只考虑到一个篮子包含多重购买的销售情况,而我还没有通过如何将销售包括在篮子中也可以包含价格促销。但是我已经离开查询10分钟而没有得到任何结果 - 只是继续运行。

我使用的内部联接我认为都是主键,因为数据库已经巧妙地设置为通过此表中内置的键链接到sales表。

提前致谢,

亲切的问候,

亚当。

0 个答案:

没有答案