【问题标题】:How to use many to many relation in SQL如何在 SQL 中使用多对多关系
【发布时间】:2017-03-02 12:23:15
【问题描述】:

以下 sql 代码 sn-p 用于使用多对多关系从 sql server 检索数据。 我未能实施 group-by 并加入这里 请提出任何好的解决方案来获得我在下面提到的结果。

select COUNT(inc.inc_id) ,Contract.Contract_n,Cust_id,
SUM(inc.service_time) / 60 as Service_Time
from inc
inner join item_con
inner join Contract on item_con.Contract_id = Contract.Contract_id
on inc.item_id = item.item_id
ORDER BY Cust_id,Contract.Contract_n

表格:公司

+--------+---------+---------+-----------+
| inc_id | cust_id | Item_id | Serv_Time |
+--------+---------+---------+-----------+
|      1 |     100 |      55 |        60 |
|      2 |     100 |      33 |       120 |
|      3 |     200 |      44 |       180 |
|      4 |     300 |      77 |        40 |
|      5 |     200 |      66 |       300 |
|      6 |     100 |      55 |       120 |
|      7 |     200 |      44 |        20 |
+--------+---------+---------+-----------+

表格:item_con

+--------+---------+
| con_id | item_id |
+--------+---------+
|    500 |      33 |
|    600 |      44 |
|    700 |      55 |
|    800 |      66 |
|    900 |      77 |
|    300 |      55 |
+--------+---------+

表:合约

+--------+---------+
| con_id | item_id |
+--------+---------+
|    300 | ABC     |
|    500 | EFG     |
|    600 | HIJ     |
|    800 | KLM     |
|    700 | NOP     |
|    900 | QRS     |
+--------+---------+

结果:

+-------+------+----------+--------------+
| Calls | Cust | Contract | Total_S_Time |
+-------+------+----------+--------------+
|     2 |  100 | NOP      |          180 |
|     1 |  100 | EFG      |          120 |
|     2 |  200 | HIJ      |          200 |
|     1 |  200 | KLM      |           40 |
|     1 |  300 | QRS      |          300 |
+-------+------+----------+--------------+

【问题讨论】:

    标签: sql-server sql-server-2008 join qsqlquery


    【解决方案1】:

    试试这个:

    DECLARE @inc TABLE (inc_id int, cust_id int, item_id int, serv_time int)
    DECLARE @item_con TABLE (item_id int, con_id int)
    DECLARE @con TABLE (item_id varchar(3), con_id int)
    
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (1, 100, 55, 60)
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (2, 100, 33, 120)
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (3, 200, 44, 180)
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (4, 300, 77, 40)
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (5, 200, 66, 300)
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (6, 100, 55, 120)
    insert into @inc (inc_id, cust_id, item_id, serv_time) values (7, 200, 44, 20)
    
    insert into @item_con (con_id, item_id) values (500, 33)
    insert into @item_con (con_id, item_id) values (600, 44)
    insert into @item_con (con_id, item_id) values (700, 55)
    insert into @item_con (con_id, item_id) values (800, 66)
    insert into @item_con (con_id, item_id) values (900, 77)
    insert into @item_con (con_id, item_id) values (300, 55)
    
    insert into @con (con_id, item_id) values (300, 'ABC')
    insert into @con (con_id, item_id) values (500, 'EFG')
    insert into @con (con_id, item_id) values (600, 'HIJ')
    insert into @con (con_id, item_id) values (800, 'KLM')
    insert into @con (con_id, item_id) values (700, 'NOP')
    insert into @con (con_id, item_id) values (900, 'QRS')
    
    
    select count(1) as Calls, i.cust_id as Cust, c.item_id as [Contract], sum(i.serv_time) as TotalTime
    from @inc i
    inner join @item_con ic on i.item_id = ic.item_id
    inner join @con c on ic.con_id = c.con_id
    group by i.cust_id, c.item_id
    

    结果:

    2   100 ABC 180
    1   100 EFG 120
    2   200 HIJ 200
    1   200 KLM 300
    2   100 NOP 180
    1   300 QRS 40
    

    【讨论】:

    • 结果中的值重复
    • 我已经输出了结果。什么在重复?
    【解决方案2】:
    select
        Calls = count(*)
      , Cust = inc.Cust_id
      , Contract = c.item_id
      , Serv_Time = sum(Serv_Time)
    from inc 
      inner join item_con as i
        on inc.Item_id = i.item_id
      inner join contract as c
        on i.con_id = c.con_id
    group by inc.Cust_id, c.item_id 
    order by inc.Cust_Id, c.Item_Id
    

    返回:

    +-------+------+----------+-----------+
    | Calls | Cust | Contract | Serv_Time |
    +-------+------+----------+-----------+
    |     2 |  100 | ABC      |       180 |
    |     1 |  100 | EFG      |       120 |
    |     2 |  100 | NOP      |       180 |
    |     2 |  200 | HIJ      |       200 |
    |     1 |  200 | KLM      |       300 |
    |     1 |  300 | QRS      |        40 |
    +-------+------+----------+-----------+
    

    测试设置:http://rextester.com/OKP21617

    create table inc (inc_id int, cust_id int, item_id int, serv_time int);
    insert into inc values
     (1,100,55,60)
    ,(2,100,33,120)
    ,(3,200,44,180)
    ,(4,300,77,40)
    ,(5,200,66,300)
    ,(6,100,55,120)
    ,(7,200,44,20);
    create table item_con (con_id int, item_id int);
    insert into item_con values
     (500,33)
    ,(600,44)
    ,(700,55)
    ,(800,66)
    ,(900,77)
    ,(300,55);
    create table contract (con_id int, item_id char(3));
    insert into contract values
     (300,'ABC')
    ,(500,'EFG')
    ,(600,'HIJ')
    ,(800,'KLM')
    ,(700,'NOP')
    ,(900,'QRS');
    select
        Calls = count(*)
      , Cust = inc.Cust_id
      , Contract = c.item_id
      , Serv_Time = sum(Serv_Time)
    from inc 
      inner join item_con as i
        on inc.Item_id = i.item_id
      inner join contract as c
        on i.con_id = c.con_id
    group by inc.Cust_id, c.item_id 
    order by inc.Cust_Id, c.Item_Id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多