【发布时间】:2010-12-30 10:15:01
【问题描述】:
编辑:最后的示例 I/O。
如果存在特定条件或不存在其他条件,我需要对这些数据进行 +1 计数。我正在使用 SQL Server 2008。
我将以下简化的示例 XML 分解为临时表并对其进行验证:
<product type="1">
<param type="1">
<item mode="0" weight="1" />
</param>
<param type="2">
<item mode="1" weight="1" />
<item mode="0" weight="0.1" />
</param>
<param type="3">
<item mode="1" weight="0.75" />
<item mode="1" weight="0.25" />
</param>
</product>
所关注的验证是以下规则:
对于每种产品类型,每种参数类型, 模式可能是 0 & (1 || 2)。在 换句话说,可能有一个 0(s),但是 然后需要 1s 或 2s,或者有 可能只有 1(s) 或 2(s)。不能有 只能是0,不能有1 和 2 秒。
我唯一没有弄清楚的部分是如何检测是否只有 0。这似乎是一个“没有”的问题。
验证码(本部分):
WITH t1 AS (
SELECT SUM(t.ParamWeight) AS S, COUNT(1) AS C,
t.ProductTypeID, t.ParamTypeID, t.Mode
FROM @t AS t
GROUP BY t.ProductTypeID, t.ParamTypeID, t.Mode
),
...
UNION ALL
SELECT TOP (1) 1 -- only mode 0 & (1 || 2) is allowed
FROM t1
WHERE t1.Mode IN (1, 2)
GROUP BY t1.ProductTypeID, t1.ParamTypeID
HAVING COUNT(1) > 1
UNION ALL
...
)
SELECT @C = COUNT(1)
FROM t2
这将显示是否混合了任何模式 1 和 2,但如果组仅包含 0,则不会显示。我确信有一个简单的解决方案,但它现在正在回避我。
编辑:
我想到了一个完美的“作弊”。我在上面添加了以下内容:
SELECT TOP (1) 1 -- only mode 0 & (null || 1 || 2) is allowed
FROM t1
GROUP BY t1.ProductTypeID, t1.ParamTypeID
HAVING SUM(t1.Mode) = 0
但是,我仍然想知道如何做到这一点而不作弊。
示例
Zero One Two Result
1 0 0 False
0 1 1 False
1 1 1 False
0 1 0 True
0 0 1 True
1 1 0 True
1 0 1 True
【问题讨论】:
标签: sql sql-server group-by aggregate-functions