查找成员与活动重叠的所有实例

问题描述 投票:0回答:1

我有一个表,其中包含 memberID 和 10 个活动作为列,每个列都有 1、0 标识该成员是否属于该活动的一部分。会员可以参与多个活动。

是否有一个 SQL 查询来查找成员所在的所有实例 在活动 1 中,在活动 2 中, 活动 1 中的所有成员也都参加了活动 2 和 3 ETC.. 不必写10!交叉连接....

Patient_AGN|MCP|P5E|CMD|KRG|EMP|CAR|SEG|CON|EMB|HP
1   |1| 0   |0| 0|  0|  0|  0|  0|  0|  0|
2   |1| 0   |0| 0|  0|  0|  0|  1|  0|  0|
3   |0| 0   |1| 0|  0|  0|  0|  0|  0|  0|
4   |0| 0   |0| 0|  0|  1|  1|  0|  0|  0|


  

研究了交叉连接,但我需要编写一个交叉连接 10!次

join combinations factorial
1个回答
0
投票

如此多的交叉联接的问题是由每个营销活动只有一列引起的,而使用一个营销活动列来标识每个营销活动会更有效。最近我看到这样的描述:你当前的表布局对人类有利,但对数据库不利。

因此,当前的表格布局可以称为“透视”,而我们需要对其进行“逆透视”操作,这样我们就只有 2 列。一旦我们这样做了,回答诸如谁参加了 X 和 Y 活动之类的问题就变得简单多了。例如:

CREATE TABLE mytable (
    Patient_AGN INT,
    MCP INT,
    P5E INT,
    CMD INT,
    KRG INT,
    EMP INT,
    CAR INT,
    SEG INT,
    CON INT,
    EMB INT,
    HP INT
);
INSERT INTO mytable (Patient_AGN, MCP, P5E, CMD, KRG, EMP, CAR, SEG, CON, EMB, HP)
VALUES 
    (1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    (2, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0),
    (3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0),
    (4, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0);
Records: 4  Duplicates: 0  Warnings: 0
CREATE VIEW myview AS
SELECT Patient_AGN, 'MCP' AS campaign FROM mytable WHERE MCP = 1
UNION ALL
SELECT Patient_AGN, 'P5E' AS campaign FROM mytable WHERE P5E = 1
UNION ALL
SELECT Patient_AGN, 'CMD' AS campaign FROM mytable WHERE CMD = 1
UNION ALL
SELECT Patient_AGN, 'KRG' AS campaign FROM mytable WHERE KRG = 1
UNION ALL
SELECT Patient_AGN, 'EMP' AS campaign FROM mytable WHERE EMP = 1
UNION ALL
SELECT Patient_AGN, 'CAR' AS campaign FROM mytable WHERE CAR = 1
UNION ALL
SELECT Patient_AGN, 'SEG' AS campaign FROM mytable WHERE SEG = 1
UNION ALL
SELECT Patient_AGN, 'CON' AS campaign FROM mytable WHERE CON = 1
UNION ALL
SELECT Patient_AGN, 'EMB' AS campaign FROM mytable WHERE EMB = 1
UNION ALL
SELECT Patient_AGN, 'HP' AS campaign FROM mytable WHERE HP = 1;

select 
       Patient_AGN
     , campaign
from myview
order by
       Patient_AGN
     , campaign
患者_AGN 活动
1 MCP
2 CON
2 MCP
3 CMD
4 汽车
4 赛格
select Patient_AGN
from myview
where campaign IN('CON','MCP')
group by Patient_AGN
having count(*) = 2
患者_AGN
2

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.