0

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

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 值发生变化时第一次获取“数据”的值。有3个ID值为1,Data的第一个值为A,所以返回A(共3个)。有两个ID值两个,Data的第一个值是Q,所以我返回Q(共2个),以此类推。

我在一个网站上做这个,所以我在如何打印东西上有一点自由。我目前正在执行两个查询,然后将它们与一个简单的 printf 一起打印(真实数据的数据列比上面示例中的多)。

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

在此示例中,WorkOrderNumber 扮演 ID 值的角色,我试图将 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);
    }   

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

4

2 回答 2

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

于 2013-04-05T15:11:46.390 回答
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 分组的内部查询数据的值将是第一次遇到,就像你想要的那样,但在其他 DBMS(如 oracle 或 sql server)上,我认为它不会起作用。

于 2013-04-05T15:16:14.753 回答