0

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

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

如果有 1 件产品组 13 和 0 件产品组 14 和 0 件产品组 16,则销售是 Type1。

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

其他销售是 Type0

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

我不确定这在 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?

谢谢阅读!我希望这是有道理的,任何建议都将不胜感激!

比格吉姆

4

1 回答 1

0

我希望我已经正确理解了你,但是这样的查询可能是你需要的(顺便说一句,我没有测试过这个,我不确定使用 COUNT - 如果它计算一个数字 > 1 会发生什么?):

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

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

测试一下,试试看,顶部的临时表将允许您使用自己的测试数据来尝试不同的情况。

此外,我删除了 WHERE 子句并添加了一个 group by,这样您就可以一目了然地看到所有测试数据......

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
于 2013-08-09T12:37:00.563 回答