我今天有sql puzzler。
我有以下sql:
SELECT MemberId,
UnitId,
MaterialLevel,
MaterialText,
ProductPercentage,
ProductPriority
FROM tblWeights
ORDER BY MemberId, MaterialLevel, MaterialText, ProductPercentage DESC
现在,ProductPriority目前为空。我想要做的是更新这个,以便每个级别的第一个产品,每个materialtext的产品百分比最高为“1”,第二个最高的百分比为“2”,等等。
但是,当materialtext更改时,它应该自行重置并再次从“1”开始。
有谁能想到我能做到这一点?
答案 0 :(得分:1)
您是否有理由将productpriority明确存储在数据库中?很抱歉,如果我误解了你的问题,但这听起来好像可以在输出查询中用直接的ROW_NUMBER处理。
答案 1 :(得分:0)
您可以将其用于初始更新:
UPDATE tblWeights w1
SET ProductPriority = (
SELECT COUNT(*)
FROM tblWeights w2
WHERE w2.level = w1.level
AND w2.materialText = w1.materialText
AND w2.ProductPercentage >= w1.ProductPercentage
)
对于自动重置,您应该在DELETE
,UPDATE
和INSERT
之后编写一个在语句级别触发的触发器。您可以使用此语句的修改版本,并仅更新具有受影响级别的行,materialtext组合
CREATE TRIGGER aiud_tblWeights ON tblWeights
FOR INSERT, UPDATE, DELETE
AS
IF( UPDATE (Level) OR UPDATE (MaterialText) )
BEGIN
UPDATE tblWeights w1
SET ProductPriority = (
SELECT COUNT(*)
FROM tblWeights w2
WHERE w2.level = w1.level
AND w2.materialText = w1.materialText
AND w2.ProductPercentage >= w1.ProductPercentage
)
WHERE (w1.level, w1.materialText) IN (
SELECT level, materialText
FROM inserted
UNION ALL
SELECT level, materialText
FROM deleted
);
END;
答案 2 :(得分:0)
我知道为时已晚。但是当我在寻找类似的问题时,我找到了一个答案。看看是否能帮到别人。
SQL query results to be displayed in the order of the manually provided values