通过LEFT JOIN获取DISTINCT工资ID总和

时间:2014-11-24 15:23:34

标签: sql sql-server sql-server-2005

我正在尝试获得总分钟,但是我的左连接无法正常工作。有没有办法为给定的MachineDescription添加一个DISTINCT总分钟的列?

这是sqlfiddle:http://sqlfiddle.com/#!2/7fd99/1

    SELECT  Work.WorkID
          , Work.Description
          , Machine.MachineDescription
          , Name.NAME
          , Work2.RegMin
          , Work.MINUTES
    FROM    Work Work 
            JOIN Machine Machine ON Machine.MachineID = Work.MachineID
            LEFT JOIN Work2 Work2 ON Work2.WorkID = Work.WorkID
            LEFT JOIN Name Name ON Name.NameID = Work2.NameID

我想要一个包含DISTINCT分钟总和的专栏。因此,WorkID 111的总分钟数将为“30”而不是“40”。

我的输出如下:

WorkID | Description | MachineDescription | Name | RegMin | Minutes
-------------------------------------------------------------------
111      Replace Belt  Splitter            Joe    10       10
111      Replace Belt  Splitter            Bob    20       10     
112      Door Broke    Splitter            Joe    10       20

我想要一个DISTINCT WorkID总分钟的列,就像这样...

WorkID | Description | MachineDescription | Name | RegMin | Minutes | Total Minutes
-----------------------------------------------------------------------------------
111      Replace Belt  Splitter            Joe    10       10         30
111      Replace Belt  Splitter            Bob    20       10         30
112      Door Broke    Splitter            Joe    10       20         30

这可能吗?

3 个答案:

答案 0 :(得分:1)

使用Correlated Sub-query获取结果。试试这个。

SELECT Work.WorkID,
       Work.Description,
       Machine.MachineDescription,
       NAME.NAME,
       Work2.RegMin,
       Work.MINUTES,
       (SELECT Sum(DISTINCT MINUTES)
        FROM   Work w
        WHERE  w.MachineID = Machine.MachineID) Total_minutes
FROM   Work Work
       JOIN Machine Machine
         ON Machine.MachineID = Work.MachineID
       LEFT JOIN Work2 Work2
              ON Work2.WorkID = Work.WorkID
       LEFT JOIN NAME NAME
              ON NAME.NameID = Work2.NameID 

输出

WorkID  Description MachineDescription  NAME    RegMin  MINUTES Total_minutes
------  ----------- ------------------  ----    ------  ------- -------------
111     Sink Broken     SPLITTER        Joe     10      10      30
111     Sink Broken     SPLITTER        Bob     20      10      30
112     Door Broken     SPLITTER        Joe     10      20      30

答案 1 :(得分:0)

    SELECT  Work.WorkID
          , Work.Description
          , Machine.MachineDescription
          , Name.NAME
          , Work2.RegMin
          , Work.MINUTES
          , (SELECT (SUM(work2.RegMin) ) FROM work2 left join work on work2.workid = work.workid) - work.minutes AS TotalMinutes
    FROM    Work Work 
    JOIN Machine Machine ON Machine.MachineID = Work.MachineID
    LEFT JOIN Work2 Work2 ON Work2.WorkID = Work.WorkID
    LEFT JOIN Name Name ON Name.NameID = Work2.NameID
    GROUP BY work.workID
          , Work.Description
          , Machine.MachineDescription
          , Name.NAME
          , Work2.RegMin
          , Work.MINUTES

<强>返回

WORKID  DESCRIPTION MACHINEDESCRIPTION  NAME    REGMIN  MINUTES TOTALMINUTES
111     Sink Broken SPLITTER            Bob     20      10      30
111     Sink Broken SPLITTER            Joe     10      10      30
112     Door Broken SPLITTER            Joe     10      20      20

答案 2 :(得分:0)

将此添加到您的选择中:

(SELECT SUM(minutes) 
 FROM (SELECT DISTINCT workid, minutes FROM WORK) W
) AS Total_Minutes