SQL Query抓取第一行新ID值,然后对重复ID值的计数求和

时间:2013-04-05 14:56:15

标签: sql ms-access

假设我有一个这种形式的表:

ID Value      Data
   1            A
   1            B
   1            C
   2            Q
   2            J
   3            D

我希望查询返回...

 A (3 total)
 Q (2 total)
 D (1 total)

正如标题所说,我想第一次获取ID值的变化时获取'数据'的值。有三个ID值为1,Data的第一个值为A,因此它返回A(总共3个)。有两个ID值为2,Data的第一个值是Q,所以我返回Q(总共2个)等。

我在网站上这样做,所以我对如何打印出来有一点自由。我目前正在进行两个查询,然后使用简单的printf将它们打印在一起(真实数据的数据列比上例中的数据更多)。

    $sql = "SELECT COUNT(VIN)
    AS vinCount 
    FROM TestTable 
    WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')
    GROUP BY WorkOrderNumber";

在这个例子中,WorkOrderNumber扮演ID Value的角色,我试图总结VIN的数量

每次都会抓住正确的数字(例如“总共3个”)。

我真正的问题是抓住第一行的值(上面提到的示例中的A,Q,D)。问题是我不能拥有'where WorkOrderNumber ='语句,因为事先我不知道它们是什么。它们是用户生成的,所以我不得不查找它们。

我有什么东西可以俯瞰吗?这是我第一次尝试的查询,显然不起作用。

    $sql = "SELECT FIRST (JobStage + ' ' + WorkItem + ' ' + VIN + ' ' + Make + ' ' + Model + ' ' + ExColor) 
    AS WorkSelection 
    FROM TestTable 
    WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')";

我是否可以添加某种WHERE子句,这在逻辑上等同于'如果这是一个之前未见过的WorkOrderNumber值,那么抓住它'?

编辑:我最终这样做了....

    //Grab number of cars
    $sql = "SELECT COUNT(VIN)
    AS vinCount 
    FROM TestTable 
    WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')
    GROUP BY WorkOrderNumber";

    $number = odbc_exec($connection, $sql);                             

    //Grab car description
    $sql = "SELECT (tmp.JobStage + ' ' + WorkItem + ' ' + VIN + ' ' + Make) AS WorkSelection
    FROM ( SELECT JobStage, WorkItem, VIN, Make FROM TestTable WHERE (JobNumber='$jobNum') AND (AssignedEmp='$EmpName')) AS tmp";


    $rs = odbc_exec($connection, $sql);

    while(odbc_fetch_row($number)){
        odbc_fetch_row($rs);
        odbc_fetch_row($rs);
        $count = odbc_result($number, 'vinCount');
        $row = odbc_result($rs, 'WorkSelection');
        //$row = odbc_result($rs, 'WorkSelection');
        printf("<option value='%s'>(%s other cars) %s</option>", $row, $count, $row);
    }   

将其拆分为两个查询,然后将它们一起打印出来。

2 个答案:

答案 0 :(得分:1)

假设MSSQL:

WITH cte As
(
  SELECT
    -- NB: Replace the "ID" in "ORDER BY ID" 
    -- with the real column you're sorting on:
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) As RowNumber,
    COUNT(1) OVER (PARTITION BY ID) As NumberOfRows,
    Data
  FROM
    TestTable
)
SELECT
  Data,
  NumberOfRows
FROM
  cte
WHERE
  RowNumber = 1

http://www.sqlfiddle.com/#!3/34385/1

答案 1 :(得分:1)

试试这个:

SELECT
    tmp.Data,
    COUNT(Table.ID)
FROM(
    SELECT
        ID,
        Data
    FROM Table 
    GROUP BY 
        ID
) as tmp
INNER JOIN Table
    ON Table.ID = tmp.ID
GROUP BY 
    tmp.Data

但是这会对mysql起作用,因为在mysql里面的内部查询我按ID分组Data的值将是你想要的第一次遇到但是在oracle或sql server之类的其他DBMS我不认为它会工作