1

私はこのクエリを持ってBanksphere.servicio_idいます.結果を取得したい.sum(XXX)Banksphere.servicio_idhora_idpeticion_idvalor

したがって、結果は次のようになるはずです...

[servicio_id 1]
(hora_id 1) (hora_id 2) (hora_id 3)   ... 
(peticion_id 1) (peticion_id 2)    ...
(media 1) (media 1) ...    
(valor 1) (valor 1) ...    
...
[servicio_id 2]
(hora_id 1)    
(peticion_id 1) (peticion_id 2) ...    
(media 2)    
(valor 2)    
...

これまでの私のクエリ -

$sqlQuery = sqlsrv_query($conn, "
    SELECT
        Umbrales.minimo as media,
        uok.minimo as media_ok,
        Banksphere.id as valor_id,
        Umbrales.id as umbral_id,
        Banksphere.servicio_id,
        Banksphere.peticion_id,
        Banksphere.hora_id,
        Banksphere.valor
    FROM
        Banksphere
    LEFT JOIN
        Umbrales
    ON Banksphere.hora_id = Umbrales.hora_id 
    AND Banksphere.dia_id = Umbrales.dia_id 
    AND Banksphere.servicio_id = Umbrales.servicio_id
    AND Banksphere.entidad_id = Umbrales.entidad_id 
    AND Banksphere.peticion_id = Umbrales.peticion_id
    LEFT JOIN
        Umbrales uok
    ON Banksphere.hora_id = uok.hora_id 
    AND Banksphere.dia_id = uok.dia_id 
    AND Banksphere.servicio_id = uok.servicio_id
    AND Banksphere.entidad_id = uok.entidad_id 
    AND uok.peticion_id = 0
    WHERE
        Banksphere.entidad_id = '$entidad_id'
    AND
        Banksphere.reconocido = 0
    AND
        Banksphere.fecha = '$fecha'
    ORDER BY
        Banksphere.servicio_id ASC,
        Banksphere.hora_id DESC,
        Banksphere.peticion_id ASC
");
4

1 に答える 1

2

短編小説:GROUPBYではなくORDERBYを使用します。MySQLを使用します。またはPostgreSQLを使用して、機能の依存関係に細心の注意を払ってください。(あなたの場合、PostgreSQLが機能するかどうかはわかりません。)

Banksphere.servicio_idが結果セット内で一意である場合は、GROUPBYを使用する代わりにORDERBYを使用してください。Banksphere.servicio_idがこのコンテキストで一意である場合、ORDER BYを使用した結果セットは確定されますが、GROUPBYを使用した結果セットは確定されません。

まず、この単純な表を見てください。

create table test (
  column_1 integer,
  column_2 integer,
  column_3 integer 
  );

insert into test values
(1, 2, 3),
(1, 4, 5),
(1, 6, 7),
(1, 8, 9);

列でグループ化すると、その列の値ごとに1行が返されます。

select column_1, column_2, column_3
from test
group by column_1

このクエリは1行を返す必要があります。もちろん、「column_1」の値は1になります。「column_2」と「column_3」にはどのような値が表示されますか?

わかりません。実際、このクエリでは、「column_2」と「column_3」の処理方法が指定されていないため、標準に準拠したSQLデータベースで構文エラーが発生します。準拠したSQLデータベースでは、「column_2」と「column_3」はGROUP BYの一部であるか、集計関数で使用する必要があります

MySQLその種のクエリをエラーなしで実行しますが、不確定な結果を返します。「サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。」MySQLはこれを機能と呼んでいます。私はそれを「設計どおりに壊れた」と呼んでいます。不確定はSQLデータベース管理システムの防御可能な機能ではありません。

わずかに異なる条件下では、準拠したdbms、GROUP BYに明示的に含まれていなくても、集約されていない列を返すことができます。たとえば、PostgreSQLでは、主キーでGROUPBYを使用できます。

GROUP BYが存在する場合、集計関数内を除いて、またはグループ化されていない列がグループ化された列に機能的に依存している場合を除いて、SELECTリスト式がグループ化されていない列を参照することは無効です。グループ化されていない列。グループ化された列(またはそのサブセット)が、グループ化されていない列を含むテーブルの主キーである場合、機能依存性が存在します。[強調追加]

したがって、PostgreSQL 9.1以降では、このような主キーを持つテーブルをクエリできます。

create table test (
  column_1 integer,
  column_2 integer,
  column_3 integer,
  column_4 integer,
  primary key (column_1, column_2)
  );

insert into test values
(1, 1, 2, 3),
(1, 2, 4, 5),
(1, 3, 6, 7),
(1, 4, 8, 9);

select column_1, column_2, column_3, column_4
from test
group by column_1, column_2
order by column_1, column_2

COLUMN_1  COLUMN_2  COLUMN_3  COLUMN_4
--
1         1         2         3
1         2         4         5
1         3         6         7
1         4         8         9

列「column_3」と「column_4」はGROUPBYの一部ではなく、集計関数の一部でもありません。ただし、GROUP BYの列と選択リストの非集計列の間には機能的な依存関係があるため、結果は確定的です。

私の知る限り、SQL標準のこの部分を実装しているのはPostgreSQLだけです。(標準はPostgreSQLよりもさらに進んでいます。)

于 2012-12-12T11:07:32.103 に答える