最好的方法?循环记录,创建一个temptable,使用一个视图?

时间:2013-08-09 12:13:57

标签: sql sql-server-2005 loops view temp-tables

SQL Server新手问题在这里!我有3个表,tbl_Sales,tbl_SalesItems,tbl_Products。 tbl_SalesItems存储添加到每个销售的产品,并通过产品代码加入tbl_Products。 tbl_Products中的产品按ProductGroup字段分类。在环境方面,任何时候都有大约200个销售,每个销售4-5个项目和3000个产品。尽管记录数量非常小,但Sales和SalesItems数据不断变化,计算将在实时环境中每天进行数百次,响应时间非常关键。

我想根据某些产品组销售的商品数量对每笔销售进行分类,具体为:

如果有,则销售为Type1 1项产品组13和 产品组14和0的0项 产品组16的0项。

如果有,则销售为Type2 产品组13和0的0项 1项产品组14和 产品组16的0项。

Else Sale是Type0

如果我使用的是Access / VBA,我会创建一个包含3条记录的记录集,即3个产品组中每个产品组的销售中的项目数,然后遍历记录以获取我的值并确定类型。 / p>

我不确定在sql server函数或存储过程中是否可以这样做?目前我正在运行三个单独的SELECT语句,然后像这样评估结果:

ALTER FUNCTION [dbo].[fSaleATCType] ( @SaleID int)
RETURNS tinyint
BEGIN

declare @InOutWashCount int
declare @OutWashCount int
declare @ExtraCount int
declare @ATCType tinyint

SET @InOutWashCount = 
    (
    SELECT COUNT(dbo.tbl_SalesItems.SaleItemCode) AS CountItems
    FROM        dbo.tbl_SalesItems LEFT OUTER JOIN
                dbo.tbl_Products ON dbo.tbl_SalesItems.SaleItemCode = dbo.tbl_Products.ProductCode
    WHERE       (dbo.tbl_SalesItems.SaleID = @SaleID) AND (dbo.tbl_Products.ProductGroup = 13)
    )

SET @OutWashCount = 
    (
    SELECT COUNT(dbo.tbl_SalesItems.SaleItemCode) AS CountItems
    FROM        dbo.tbl_SalesItems LEFT OUTER JOIN
                dbo.tbl_Products ON dbo.tbl_SalesItems.SaleItemCode = dbo.tbl_Products.ProductCode
    WHERE       (dbo.tbl_SalesItems.SaleID = @SaleID) AND (dbo.tbl_Products.ProductGroup = 14)
    )

SET @ExtraCount = 
    (
    SELECT COUNT(dbo.tbl_SalesItems.SaleItemCode) AS CountItems
    FROM        dbo.tbl_SalesItems LEFT OUTER JOIN
                dbo.tbl_Products ON dbo.tbl_SalesItems.SaleItemCode = dbo.tbl_Products.ProductCode
    WHERE       (dbo.tbl_SalesItems.SaleID = @SaleID) AND (dbo.tbl_Products.ProductGroup = 16)
    )

SET @ATCType = 0

if @InOutWashCount = 1 and @OutWashCount = 0 and @ExtraCount = 0
    SET @ATCType = 1

if @InOutWashCount = 0 and @OutWashCount = 1 and @ExtraCount = 0
    SET @ATCType = 2

RETURN @ATCType

END

从中做三个SELECT?

这是最好的方法吗?我会更好地创建一个temptable然后从中做三个SELECT吗?或创建像

这样的视图
SELECT      dbo.tbl_SalesItems.SaleID, 
        dbo.tbl_Products.ProductGroup, 
        COUNT(dbo.tbl_SalesItems.SaleItemCode) AS CountItems

FROM        dbo.tbl_SalesItems LEFT OUTER JOIN
            dbo.tbl_Products ON dbo.tbl_SalesItems.SaleItemCode = dbo.tbl_Products.ProductCode

GROUP BY    dbo.tbl_Products.ProductGroup, 
        dbo.tbl_SalesItems.SaleID

从中做三个SELECT?

感谢阅读!我希望这是有道理的,非常感谢任何建议!

BiigJiim

1 个答案:

答案 0 :(得分:0)

我希望我能正确理解你,但这样的查询可能就是你所需要的 (顺便说一句,我没有对此进行测试,我不确定是否使用COUNT - 如果数字> 1,会发生什么?):

(编辑:我添加了一些测试数据和结果,以帮助澄清情况,还调试了一些复制和粘贴错误。)

基本上每个左连接表示来自特定组的销售项目产品,case语句是逻辑的驱动程序。

测试它并进行游戏,顶部的临时表将允许您使用自己的测试数据来尝试不同的情况。

此外,我还删除了WHERE子句并添加了一个组,因此您可以一目了然地查看所有测试数据...

DECLARE @SaleId int
DECLARE @tbl_SalesItems AS TABLE(SaleID int, SaleItemCode varchar(10))
DECLARE @tbl_Products AS TABLE(ProductGroup int, ProductCode varchar(10))

INSERT INTO @tbl_SalesItems(SaleID, SaleItemCode) VALUES (1,'Product1')
INSERT INTO @tbl_SalesItems(SaleID, SaleItemCode) VALUES (2,'Product2')
INSERT INTO @tbl_SalesItems(SaleID, SaleItemCode) VALUES (3,'Product1')
INSERT INTO @tbl_SalesItems(SaleID, SaleItemCode) VALUES (3,'Product2')
INSERT INTO @tbl_SalesItems(SaleID, SaleItemCode) VALUES (3,'Product3')

INSERT INTO @tbl_Products(ProductGroup, ProductCode) VALUES (13, 'Product1')
INSERT INTO @tbl_Products(ProductGroup, ProductCode) VALUES (14, 'Product2')
INSERT INTO @tbl_Products(ProductGroup, ProductCode) VALUES (16, 'Product3')
INSERT INTO @tbl_Products(ProductGroup, ProductCode) VALUES (16, 'Product4')

SET @SaleId = 1

SELECT  si.SaleId
       ,CASE
        WHEN COUNT(pg13.ProductCode) = 1 AND COUNT(pg14.ProductCode) = 0 AND COUNT(pg16.ProductCode)  = 0
        THEN 1
        WHEN COUNT(pg13.ProductCode) = 0 AND COUNT(pg14.ProductCode) = 1 AND COUNT(pg16.ProductCode)  = 0
        THEN 2
        ELSE 0 END AS ATCType
FROM        @tbl_SalesItems si
LEFT JOIN   @tbl_Products  pg13
    ON si.SaleItemCode = pg13.ProductCode
    AND (pg13.ProductGroup = 13)
LEFT JOIN   @tbl_Products  pg14
    ON si.SaleItemCode = pg14.ProductCode
    AND (pg14.ProductGroup = 14)
LEFT JOIN   @tbl_Products  pg16
    ON si.SaleItemCode = pg16.ProductCode
    AND (pg16.ProductGroup = 16)
--WHERE si.SaleId = @SaleId
GROUP BY si.SaleId

<强>结果:

SaleId  ATCType
1       1
2       2
3       0
4       2