sql - 如果它们满足不同的条件,则选择两个不同的项目
问题描述
我对 mssql 有一个选择问题:
Invoice 1
ItemUniqueNo ItemName InvoceNo
1 A 123
3 C 123
Table A (All Invoices)
ItemUniqueNo ItemName InvoceNo
1 A 123
2 B 235
3 C 123
Table B (Item List)
ItemUniqueNo ItemName ItemGroup
1 A XXX
2 B YYY
3 C ZZZ
我想选择每个项目(来自表 A)如果发票有两种类型的产品:ItemUniqueNo=3和ItemGroup = XXX,在同一张发票中。这是我的代码:
SELECT
*
FROM
TABLE_A
WHERE
(ItemUniqueNo IN (SELECT ItemUniqueNo FROM TABLE_B WHERE ItemGroup='XXX') OR ItemUniqueNo = 3)
使用此代码,我列出了具有ItemGroup = XXX和ItemUniqueNo=3但我想在同一张发票中同时满足这两个条件的所有项目,例如:
Invoice 1
ItemUniqueNo ItemName InvoceNo
1 A 123 ---> This meets 'XXX' ItemGroup condition
3 C 123 ---> This meets '3' ItemUniqueNo condition
这张发票同时满足两个条件,所以我想用 InvoceNo 列出这两个项目。以及符合此条件的所有其他项目。
解决方案
您可以在 where 子句中使用 case 语句而不是“OR”,然后您的输出将与您之前想要的匹配。你可以看看我的回答。
Create table TableA (ItemUniqueNo int, ItemName Char(1), InvoceNo int)
insert into TableA Values
(1, 'A', 123),
(2, 'B', 235),
(3, 'C', 123),
(4, 'A', 999),
(3, 'B', 999)
Create table TableB (ItemUniqueNo int, ItemName Char(1), ItemGroup Varchar(10))
insert into TableB Values
(1, 'A', 'XXX'),
(2, 'B', 'YYY'),
(3, 'C', 'ZZZ'),
(4, 'A', 'XXX')
SELECT TABLEA.*
FROM TABLEA INNER JOIN (SELECT DISTINCT TABLEA.INVOCENO
FROM (SELECT TABLEA.INVOCENO,
(CASE
WHEN ITEMGROUP = 'XXX' THEN 1
WHEN TABLEA.ITEMUNIQUENO = 3 THEN 1
ELSE 0
END)
AS FLAG
FROM TABLEA
INNER JOIN TABLEB
ON CONCAT(TABLEA.ITEMUNIQUENO,TABLEA.ITEMNAME) = CONCAT(TABLEB.ITEMUNIQUENO,TABLEB.ITEMNAME))
TABLEA
WHERE FLAG = 1) COND ON TABLEA.INVOCENO = COND.INVOCENO
推荐阅读
- python-3.x - 如何在日期列中合并月日年列?
- google-apps-script - 如何让我的可安装触发器运行一次而不是两次?
- javascript - 找不到名称“ENV”returnTo:ENV.BASE_URI
- node.js - 使用 node-vault 访问 HashiCorp Vault KV secret
- machine-learning - 使用欧几里得距离对混合数据进行聚类
- facebook - 如何在 Nestjs facebook 策略回调 url 中传递动态参数
- python - 基于另一列的每个值的列值总和并将其除以总计
- list - 在列表中创建 Spark 数据框后如何使用它们?
- php - 教义命名策略未映射默认值
- vue.js - 与 vue2-leaflet 插件一起使用时,Gridsome 构建失败