sql - 不同表的查询

标签 sql sql-server database

我有 2 张 table

表A

INV    AMT   DISC
1001  1500    150
1002  3000    300

表B

INV  DESC        AMT
1001 CHARGES     100
1001 FREIGHT      30
1001 INSURANCE    20
1002 CHARGES     215
1002 FREIGHT      32
1002 INSURANCE    25

为了合并两个表,我使用了以下查询(由 Mikael Eriksson 提供):-

select
    A.inv,
    A.amount,
    A.disc,
    B.charges,
    B.freight,
    B.insurance
from @TableA as A
    inner join (
                SELECT t.inv,
                       MAX(CASE WHEN t.description = 'CHARGES' THEN t.amount ELSE NULL END) AS charges,
                       MAX(CASE WHEN t.description = 'FREIGHT' THEN t.amount ELSE NULL END) AS freight,
                       MAX(CASE WHEN t.description = 'INSURANCE' THEN t.amount ELSE NULL END) AS insurance
                FROM @TableB as t
                GROUP BY t.inv) as B
        on A.inv = B.inv    

然后,我将得到以下输出:-

INV     AMT   DISC    CHARGES FREIGHT INSURANCE
1001   1500    150      100      30       20
1002   3000    300      215      32       25

问题,如果我想说,费用等于 100,如何在前面的语句中添加查询。最终结果将如下所示:-

INV     AMT   DISC    CHARGES FREIGHT INSURANCE
1001   1500    150      100      30       20

最佳答案

select
    A.inv,
    A.amt,
    A.disc,
    B.charges,
    B.freight,
    B.insurance
from TableA as A
    inner join (
                SELECT t.inv,
                       MAX(CASE WHEN t.descr = 'CHARGES' THEN t.amt ELSE NULL END) AS charges,
                       MAX(CASE WHEN t.descr = 'FREIGHT' THEN t.amt ELSE NULL END) AS freight,
                       MAX(CASE WHEN t.descr = 'INSURANCE' THEN t.amt ELSE NULL END) AS insurance
                FROM TableB as t
                GROUP BY t.inv) as B
        on A.inv = B.inv
where charges = 100   --<< just add this

根据包含 tableb.amt = 100 和 descr = 'charges' 的行数,您最好以这种方式编写查询。

select a.inv, a.amt, a.disc,
  b.amt AS charges,
  c.amt AS freight,
  d.amt AS insurance
from tablea a
inner join tableb b on b.inv = a.inv and b.descr = 'CHARGES' and b.amt = 100
left join tableb c on c.inv = a.inv and c.descr = 'FREIGHT'
left join tableb d on d.inv = a.inv and d.descr = 'INSURANCE'

测试数据

create table tablea (inv int, amt int, disc int);
insert tablea select 1001,1500,150;
insert tablea select 1002,3000,300;

create table tableb (inv int, descr varchar(10), amt int);
insert tableb select 1001, 'CHARGES', 100;
insert tableb select 1001, 'FREIGHT', 30;
insert tableb select 1001, 'INSURANCE', 20;
insert tableb select 1002, 'CHARGES', 215;
insert tableb select 1002, 'FREIGHT', 32;
insert tableb select 1002, 'INSURANCE', 25;

输出

inv         amt         disc        charges     freight     insurance
----------- ----------- ----------- ----------- ----------- -----------
1001        1500        150         100         30          20
Warning: Null value is eliminated by an aggregate or other SET operation.

(1 row(s) affected)

注意:使用建议的第二个查询,输出中不存在警告

关于sql - 不同表的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812538/

相关文章:

sql - 如何将 sqlite.swift 语句打印为 SQL?

mysql - 插入忽略不会忽略

php - 查询在 MYSQL 中工作但在 Codeigniter 中不工作

sql - Sql-Server 中的父子关系问题

mysql - 连接多个查询错误

php - MySQL 数据库级别选择

mysql - MySQL插入查询中的用户定义变量

sql-server - SqlStatementSource 表达式与变量源类型

sql-server - SQL Server 2016 快速安装错误 : attempted to perform an unauthorized operation

php - 从数据库中获取图像