2017-07-28 47 views
0

所以我有下面的表(见下面),我想写一个查询来返回所有在三个票据列中都有以下内容的游戏数字。SQL - 返回行数据的结果

E.G.给我所有的游戏中有1,2和3的数字。

这些数字并不一定要在某些列(比如Ticket1等中的1)。他们只需要全部进入游戏的行列。

我会发布我目前为止的查询,但它完全没用,真的需要一双新的眼睛来看看这是否可能,如果是这样,如何?

enter image description here

+3

在我看来,这是一个糟糕的桌子设计。您可能需要一个非常难看的查询来查找所有拥有1张,2张,3张在任何位置的门票的游戏。当你发现自己写难看的问题时,你应该对表格设计提出质疑。相反,将每张票单独存放在一行中。 –

+0

我同意表格设计可以更好,但OP可能没有权限或能力进行这些更改。 –

+0

@TimBiegeleisen - 我同意这一点。你介意你的建议吗? –

回答

0

跨应用条件计数门票的工会。

select * 
from myTable 
cross apply ( 
    select count(case when ticket in (1,2,3) then ticket end) cnt 
    from (
     select Ticket1 ticket 
     union 
     select Ticket2 ticket 
     union 
     select Ticket3 ticket 
    ) t 
) t 
where t.cnt = 3 
3

E.G.给我所有的游戏号码,其中1,2 3。

这些数字并不一定要在某些列(比如Ticket1等中的1)。他们只需要全部进入游戏的行列。

select Game 
from [table-name] 
where 
(Ticket1 ='1' and Ticket2 ='2' and Ticket3 ='3') or 
(Ticket1 ='1' and Ticket2 ='3' and Ticket3 ='2') or 
(Ticket1 ='2' and Ticket2 ='1' and Ticket3 ='3') or 
(Ticket1 ='2' and Ticket2 ='3' and Ticket3 ='1') or 
(Ticket1 ='3' and Ticket2 ='1' and Ticket3 ='2') or 
(Ticket1 ='3' and Ticket2 ='2' and Ticket3 ='1') 

这将返回443

0

你可以做以下

select * from Table1 
where (
cast(Ticket1 as varchar(100)) 
+ ',' + 
cast(Ticket2 as varchar(100)) 
+ ',' + 
cast(Ticket3 as varchar(100))) in 
('1,2,3','1,3,2','2,1,3','2,3,1','3,1,2','3,2,1') 
0

我不明白确切的要求所以这里有2种解释:

要获得具有相同的行中的确切数字1,2,3所有游戏号码:

从[表名]选择游戏 其中 Ticket1在(1,2,3)和Ticket2在(1,2,3)和Ticket3在(1,2,3)

要获得具有相同的行中包含1,2,3值的所有游戏的数字:

选择游戏 从[表名] 其中 (Ticket1 LIKE '%1%' 或Ticket1等(Ticket2 like'%1%'或Ticket2 like'%2%'or Ticket2 like'%3%') and(Ticket3 like'%1%') and(Ticket3 like'%1% '或Ticket3 like'%2%'或Ticket3 like'%3%')

0

@Andy的回答看起来是正确的,但希望您能看到在您的表格中使用它的麻烦CUR租金表格。相反,我建议您将每个游戏票证关系存储在单独的中。这是第一个六个记录会是什么样与您当前的数据:

Game | Ticket 
443 | 1 
443 | 2 
443 | 3 
444 | 57 
444 | 13 
444 | 33 

现在很容易识别具有一组三个某些门票,例如所有的游戏

SELECT Game 
FROM yourTable 
WHERE Ticket IN (1, 2, 3) 
GROUP BY Game 
HAVING COUNT(DISTINCT Ticket) = 3