【问题标题】:Select distinct column values and add the related of values of another column选择不同的列值并添加另一列的相关值
【发布时间】:2014-07-17 01:14:58
【问题描述】:

我正在开发一个时间卡系统,用户可以在其中输入单个单位或“运行”单位的时间。

我已经创建了时间输入部分,用户可以在其中针对“运行”输入时间,它将为指定为该“运行”一部分的每个单位创建单独的行。它还划分了他们输入的时间(即 run15 有 8 小时反对它,所以每个单元将获得 4 小时) 请注意,如果时间是针对单个单位输入的,则 RunNum 留空。

UnitNum    RunNum       Hours               Date
---        ----         ------            --------
1          12            5                08-01-2013
2          12            5                08-01-2013
3          12            5                08-01-2013
4          -            10                08-02-2013
5          -             8                08-02-2013
6          -             4                08-03-2013
9          15            4                08-03-2013
9          15            4                08-03-2013
1          12            1.5              08-04-2013
2          12            1.5              08-04-2013
3          12            1.5              08-04-2013

现在我正在进入系统的编辑部分;事情有点复杂。 由于我不希望用户必须在运行中编辑单个单元,我希望它再次显示为单次运行。

我需要结合不同的运行;添加相应的时间,其中日期相同;并隐藏unitnum:

UnitNum    RunNum       Hours               Date
---        ----         ------            --------
-          12           15                08-01-2013
4          -            10                08-02-2013
5          -             8                08-02-2013
6          -             4                08-03-2013
-          15            8                08-03-2013
-          12            4.5              08-04-2013

到目前为止,我的代码抓取了所有内容,如下所示:

<?PHP
$EditPickSelect = SQLSRV_QUERY($conn1,"SELECT runnum, unitnum, date, hours FROM dbo.TimecardHours ORDER BY date");
ECHO "<br>";
ECHO "<table border='1'>";

ECHO "<tr>";

ECHO "<td>";
    ECHO "Run";
ECHO "</td>";

ECHO "<td>";
    ECHO "Unit";
ECHO "</td>";

ECHO "<td>";
    ECHO "Hours";
ECHO "</td>";

ECHO "<td>";
    ECHO "Date";
ECHO "</td>";

ECHO "</tr>";


WHILE ($EditPickFetch=SQLSRV_FETCH_ARRAY($EditPickSelect, SQLSRV_FETCH_ASSOC))
{

ECHO "<tr>";

    ECHO "<td>";
    ECHO "<center>";
        if ($EditPickFetch['runnum'] == '') {
        ECHO "-";
        } else {
        ECHO $EditPickFetch['runnum'];
        }
    ECHO "</center>";
    ECHO "</td>";

    ECHO "<td>";
    ECHO "<center>";
        if ($EditPickFetch['unitnum'] == '') {
        ECHO "-";
        } else {
        ECHO $EditPickFetch['unitnum'];
        }
    ECHO "</center>";
    ECHO "</td>";

    ECHO "<td>";
    ECHO "<center>";
        ECHO $EditPickFetch['hours'];
    ECHO "</center>";
    ECHO "</td>";

    ECHO "<td>";
    ECHO "<center>";
        ECHO $EditPickFetch['date'];
    ECHO "</center>";
    ECHO "</td>";

ECHO "</tr>";

}

ECHO "</table>";
?>

【问题讨论】:

    标签: sql-server distinct


    【解决方案1】:

    这应该适合你。

    SELECT NULL AS UnitNum, [Runnum], SUM([Hours]), [Date]
    FROM [Dbo].Timecardhours
    WHERE Runnum IS NOT NULL
    GROUP BY Date, 
      Runnum
    UNION ALL
    SELECT UnitNum, [Runnum], SUM([Hours]), [Date]
     FROM [Dbo].Timecardhours
    WHERE Runnum IS NULL
    GROUP BY Date, 
      Runnum, 
      Unitnum;
    

    【讨论】:

    • 这非常接近,Dbloch;但是,我希望 Unitnum 显示该单元是否没有 Runnum。另外,处理没有 Runnum 的 Units 的 select 语句可以显示它;但是当它们被联合时,它会中断,因为运行选择必须忽略单位才能工作。
    • 编辑了选择语句,我相信这就是你所要求的。
    • 这就是关键。需要在两个 select 语句中都有该列才能使联合工作。由于它不能存在于一个select语句中,所以选择该列为NULL。
    【解决方案2】:

    听起来您只想进行聚合:

    Select runNum, date, sum(hours) as hours 
    from dbo.TimeCardHours 
    Group by runNum, date 
    order by Date
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 2022-01-01
      • 1970-01-01
      • 2017-02-14
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多