mysql 基于特定值的SQL CASE

i2byvkas  于 11个月前  发布在  Mysql
关注(0)|答案(2)|浏览(97)

我试图更好地理解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”,通过不同的行。

8tntrjer

8tntrjer1#

根据新的要求(我认为如下

  • 每行在column 1或column 2中必须有一个值
  • 合同类型不能重复
  • 应该有两排
  • 基于代码,这可能需要在第一个项目符号中有3列或更多列

下面是要解决的代码:

SELECT 
    -- ... all the columns for the data you need
    COUNT(Column1 = 'x') as col1cnt,
    COUNT(Column2 = 'x') as col2cnt,
    COUNT(ContactType) as ctrows
 FROM tablenameyoudidnotsay
 GROUP BY Contract
 WHERE col1cnt = 1 and col2cnt = 1 and ctrows = 2

字符串
注意--基于上面的查询,如果你想要其他不在组中的列,你需要将其作为一个连接到Contract上的主查询的子查询--只提取正确的列,或者在where子句周围添加一个not,只提取错误的列。

nzk0hqpo

nzk0hqpo2#

您需要使用GROUP BY来定义行组,然后使用apply CASE子句来检查合约是否正确设置:
WHERE子句将过滤掉不必要的数据。
MAX(column1) = 'x' and MAX(column2) = 'x'以确保两列都具有值x
由于您正在搜索两种合约类型的组合,COUNT(DISTINCT Contract_Type) = 2将仅将您的结果限制为具有这两种类型的合约。

SELECT Contract, 
       CASE WHEN COUNT(DISTINCT Contract_Type ) = 2 
                 AND MAX(column1) = 'x' 
                 AND MAX(column2) = 'x'
            THEN 'OK' 
            ELSE 'NOK' 
       END AS results
FROM mytable
WHERE Contract_Type = 'Type 1' OR
      Contract_Type = 'Type 2'
GROUP BY Contract;

字符串
您的表模式是“EAV”或“属性-值”。如果每个实体的属性数未知或不稳定,则应用程序可以使用此模式
Demo here

相关问题