假设我有一个这种形式的表:
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);
}
将其拆分为两个查询,然后将它们一起打印出来。
答案 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
答案 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我不认为它会工作