我希望我以有道理的方式说出来;
我正在尝试为companyID列表执行基本的select语句。问题中的论据是关于发票的选项。我们有多种发票类型,可以设置为通过电子邮件发送或打印。它们可以像某些电子邮件一样混合,一些打印,一些没有选择。我需要为每个公司ID检查总共9种唯一的发票类型。
我正在尝试选择不同的公司ID(cmp_id),其中每个单一的invoicetype的打印AND电子邮件选项都是N或NULL。所有发票类型的打印和电子邮件都必须关闭两个选项(在我选择的表格中,每个特定类型的同一公司ID有9条记录)
一些例子(我在这个例子中只使用了3种发票类型):
Cmp_id invoiceType print e-mail
company1 credit Y N
company1 supplemental Y N
company1 misc Y Y
company2 supplemental N N
company2 misc N N
结果应该是cmp_id的单个列;在示例中,它只是company2。
答案 0 :(得分:0)
这会有效吗?
SELECT DISTINCT Cmp_ID from dbo.table where (Print = 'N') AND (E-Mail = 'N') OR
(Print IS NULL) AND (E-Mail IS NULL)
答案 1 :(得分:0)
只需填写一个COUNT
来检查你有多少'Y'
。
我假设print
而e-mail
只有3个州,Y
,N
或NULL
SELECT Cmp_id
FROM YourTable
GROUP BY Cmp_id
HAVING COUNT(CASE WHEN print = 'Y' or e-mail = 'Y' THEN 1 END) = 0
因此,如果count为0,则表示所有值均为NULL
或N
<强> Working DEMO 强>
答案 2 :(得分:0)
SELECT DISTINCT Cmp_ID
FROM dbo.table
WHERE
COALESCE([Print], 'N') = 'N'
AND
COALESCE([E-Mail], 'N') = 'N'
使用coalesce来捕获NULL和Ns。
答案 3 :(得分:0)
假设:
每个[Cmp_ID]
在表格中有n行,其中n是[invoiceTypes]
的数量
示例数据:
CREATE TABLE #temp ([Cmp_id] VARCHAR(20), [invoiceType] VARCHAR(20), [print] VARCHAR(20), [e-mail] VARCHAR(20), )
INSERT INTO #temp
VALUES
('company1','credit','Y','N'),
('company1','supplemental','Y','N'),
('company1','misc','Y','Y'),
('company2','credit','N','N'),
('company2','supplemental','N','N'),
('company2','misc','N','N')
使用公用表Expression,GROUP BY和HAVING查询:
我们为[Print]
和[e-mail]
NULL
或'N'
的每一行指定值1。然后,我们仅检索公司[Cmp_id]
的所有invoiceType为[Print]
,[e-mail]
为NULL
或'N'
。
;WITH CTE AS ( SELECT [Cmp_id],
[NoneSelected] = CASE WHEN ISNULL([print],'N') = 'N' AND ISNULL([e-mail],'N') ='N' THEN 1 ELSE 0 END
FROM #temp )
SELECT Cmp_id
FROM CTE
GROUP BY Cmp_id
HAVING SUM(NoneSelected) = 3 --<-- change this to 9 for 9 invoice types
结果:
尝试使用临时表来回应评论&#34;我们考虑兼容性80,我之前尝试过使用过CTE但他们没有工作:S感谢输入。 #34;:
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL
DROP TABLE #temp2;
SELECT [Cmp_id],
[NoneSelected] = CASE WHEN ISNULL([print],'N') = 'N' AND ISNULL([e-mail],'N') ='N' THEN 1 ELSE 0 END INTO #temp2
FROM #temp
SELECT Cmp_id
FROM #temp2
GROUP BY Cmp_id
HAVING SUM(NoneSelected) = 3 --<-- change this to 9 for 9 invoice types
答案 4 :(得分:0)
SELECT T1.Cmp_id, COUNT(*)
FROM dbo.table T1
WHERE
COALESCE([Print], 'N') = 'N'
AND
COALESCE([E-Mail], 'N') = 'N'
GROUP BY T1.Cmp_id
HAVING COUNT(T1.Cmp_id) = (SELECT COUNT(1) FROM dbo.table WHERE Cmp_id = T1.Comp_Id)
计算两个选项都是NULL或N,并且count =表中Cmp_Ids的计数。