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値に変化があったので初めて「Data」の値を取得したいと思います。1 の ID 値が 3 つあり、Data の最初の値が A であるため、A を返します (合計 3 つ)。2のID値が2つあり、Dataの最初の値がQなので、Q(合計2)などを返します。

私はウェブサイトでこれを行っているので、印刷方法には少し自由があります。私は現在 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);
    }   

それを 2 つのクエリに分割して、まとめて出力するだけです。

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 に答える