根据多个参数选择不同的值

时间:2016-02-22 14:59:15

标签: sql-server-2008 tsql

我希望我以有道理的方式说出来;

我正在尝试为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。

5 个答案:

答案 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'

我假设printe-mail只有3个州,YNNULL

 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,则表示所有值均为NULLN

<强> 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

结果:

enter image description here

尝试使用临时表来回应评论&#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的计数。