每个部分必须有一个值

时间:2019-03-27 12:33:15

标签: tsql

enter image description here查找记录,其中所提供类别的值不存在

因此,我需要生成一个查询,以将用户输入的数据引用到用户表单中。该表单是一个复选框类型,如果未选择任何值,则应输入一个复选框,上面写着“ None of the above”。该表格分为4个不同的部分,每个部分都需要在相关的方框中打勾,或者如果没有相关的方框,则每个部分的该部分的“以上都不是”框中都应打勾。

现在,我正在查看后台的表,并试图构造一个查询来突出显示一个或多个部分中的一个框,甚至没有“ None of the above”框都没有打勾的记录。

本质上,我们希望确保表单(每个表单都有其自己的ID)已完全填充。

就本网站而言,假设我的数据都在一个表中:

有什么主意我可以构造这个查询吗?

在上面的示例中,我想标识客户789,因为他们缺少第3部分的值

这是我正在尝试做的简化版本,但希望会清楚

1 个答案:

答案 0 :(得分:0)

理想情况下,您的输入表单将具有不允许这样做的验证。但是,我意识到这可能不受您的控制。这将适用于您提供的简化示例。希望您可以根据需要进行修改。

语法可能会有所不同,具体取决于您的数据库平台。这是在SQL Server上。

CREATE TABLE #Section (ID INT)

INSERT INTO #Section (ID) VALUES (1)
INSERT INTO #Section (ID) VALUES (2)
INSERT INTO #Section (ID) VALUES (3)
INSERT INTO #Section (ID) VALUES (4)

CREATE TABLE #CustomerResponse (CustomerID INT, FormID INT, SectionID INT, value VARCHAR(25))

INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (789, 1, 1, '1')
INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (789, 1, 2, 'none of the above')
INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (789, 1, 4, '1')
INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (454, 2, 1, '1')
INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (454, 2, 2, '1')
INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (454, 2, 3, '1')
INSERT INTO #CustomerResponse (CustomerID, FormID, SectionID, value) VALUES (454, 2, 4, '1')

SELECT DISTINCT cr1.CustomerID, cr1.FormID, 1 AS MissingSection FROM #CustomerResponse cr1
LEFT JOIN #CustomerResponse cr2 ON cr1.CustomerID = cr2.CustomerId AND  cr2.SectionID = 1
WHERE cr2.CustomerID IS null
UNION
SELECT DISTINCT cr1.CustomerID, cr1.FormID, 2 AS MissingSection FROM #CustomerResponse cr1
LEFT JOIN #CustomerResponse cr2 ON cr1.CustomerID = cr2.CustomerId AND  cr2.SectionID = 2
WHERE cr2.CustomerID IS null
UNION
SELECT DISTINCT cr1.CustomerID, cr1.FormID, 3 AS MissingSection FROM #CustomerResponse cr1
LEFT JOIN #CustomerResponse cr2 ON cr1.CustomerID = cr2.CustomerId AND  cr2.SectionID = 3
WHERE cr2.CustomerID IS null
UNION
SELECT DISTINCT cr1.CustomerID, cr1.FormID, 4 AS MissingSection FROM #CustomerResponse cr1
LEFT JOIN #CustomerResponse cr2 ON cr1.CustomerID = cr2.CustomerId AND  cr2.SectionID = 4
WHERE cr2.CustomerID IS null

我不喜欢这种解决方案,但是它确实有效。也许有人会带来更好的东西。