我试图更好地理解SQL,当涉及到键值对时遇到了一个问题(我认为有一个更好的术语,但不确定)。
| 合同|合同类型|Column1| Column2|
| --|--|--|--|
| 合同1| 1型|X||
| 合同1| 2型||X|
| 合同2| 1型|X||
| 合同2| 2型|X||
如果这个例子不清楚,我很抱歉。我知道可能有一种方法可以更好地设置这个表,但这只是我编造的一个例子。
我试图创建一个SQL查询,检查合同是否设置正确。作为一个例子,合同1设置正确,因为当它说'类型1'时,第1列中有一个x,当它说'类型2'时,第2列中有一个x。
然而,我不确定如何为合约2编写CASE语句,因为它需要单独检查每个合约,看看是否有一行在正确的地方有一个“x”。
到目前为止,我已经写了两行都没有x,而两行都有x的情况下的CASE语句:
SELECT DISTINCT Table1.Contract,
Table1.ContractType,
Table1.Column1,
Table1.Column2,
Table1.Site
Table1.Date,
CASE
WHEN Column1 <> 'x' AND Column2 <> 'x' THEN 'Error'
WHEN Column1 = 'x' AND Column2 = 'x' THEN 'Error'
END AS 'Results'
FROM...
JOIN...
WHERE Contract IN (
SELECT Contract
FROM Table1
WHERE ContractType IN ('Type1','Type2','Type3') AND
Site = 'Site 1' AND
Contract HAVING COUNT(DISTINCT ContractType) >= 2
) AND Date >= CURRENT_TIMESTAMP
ORDER BY Contract
字符串
我如何检查每个合约的第一行的列1中有x,并检查第二行的列2中有x?
谢谢你,谢谢
编辑:在“完整查询”中编辑,有一些抽象,不显示真实的数据。有些事情我可能解释得不好:从技术上讲,如果Column 2在Type 1行中有一个“x”,反之亦然。重要的是,对于每个合约,两列中都有一个“x”,通过不同的行。
2条答案
按热度按时间8tntrjer1#
根据新的要求(我认为如下
下面是要解决的代码:
字符串
注意--基于上面的查询,如果你想要其他不在组中的列,你需要将其作为一个连接到Contract上的主查询的子查询--只提取正确的列,或者在where子句周围添加一个not,只提取错误的列。
nzk0hqpo2#
您需要使用
GROUP BY
来定义行组,然后使用applyCASE
子句来检查合约是否正确设置:WHERE
子句将过滤掉不必要的数据。MAX(column1) = 'x' and MAX(column2) = 'x'
以确保两列都具有值x
由于您正在搜索两种合约类型的组合,
COUNT(DISTINCT Contract_Type) = 2
将仅将您的结果限制为具有这两种类型的合约。字符串
您的表模式是“EAV”或“属性-值”。如果每个实体的属性数未知或不稳定,则应用程序可以使用此模式
Demo here