1

SQLFiddleにサンプルテーブルがあります。

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT UNIQUE,
  Shot VARCHAR(4),
  sec varchar(5),
  lay VARCHAR(15) NOT NULL,
  lay_status VARCHAR(15) NOT NULL,
  blk VARCHAR(10) NOT NULL,
  blk_status VARCHAR(15) NOT NULL,
  pri VARCHAR(10) NOT NULL,
  pri_status VARCHAR(15) NOT NULL,
  ani VARCHAR(10) NOT NULL,
  ani_status VARCHAR(15) NOT NULL,
  status VARCHAR(5)
);

INSERT INTO my_table VALUES
(1,'SH01','3','1863','yes','1863','yes','P4645','yes','P4557','yes','Over'),
(2,'SH02','2.5','1863','yes','P4645','no','P4557','yes','1863','no','Over'),
(3,'SH03','0.5','P4645','yes','P4557','yes','1863','yes','1863','yes','WIP'),
(4,'SH04','1.25','1863','no','P4645','no','P4557','yes','1863','yes','RTK'),
(5,'SH05','1','1863','yes','1863','yes','P4645','yes','P4557','yes','WIP'),
(6,'SH06','6','P4557','yes','P4645','yes','P4645','yes','P4557','yes','WIP');

以下のSQLを使用してのショットを取得しましたlay=1863。秒の下部にある合計を取得します。

Bu結果は間違っています。誰かが私を導くことができますか?

SELECT 
  IFNULL(Shot,'TOTAL') AS Shot
  , sec
  , lay
FROM my_table
where lay='1863'
group by shot with rollup;

合計(秒列の場合)の結果は7.75になり、1が表示されます。

SHOT    SEC     LAY
SH01    3       1863
SH02    2.5     1863
SH04    1.25    1863
SH05    1       1863
TOTAL   7.75    
4

7 に答える 7

3

合計が必要な場合は、このクエリを使用してください

SELECT 
  Shot
  , sum(sec)
FROM my_table
where lay='1863'
group by shot with rollup;

GROUP BY句は、サマリー出力に追加の行を追加するWITHROLLUP修飾子を許可します。これらの行は、上位レベル(または超集計)の要約操作を表します

http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.htmlを参照してください

于 2013-03-06T11:15:01.130 に答える
2

問題はGROUP BY、集計関数なしでを使用していることです。現在のクエリでは、ロールアップする列である列で使用sum()していません。sec使用してみてください:

SELECT 
  coalesce(Shot,'TOTAL') AS Shot
  , sum(sec) Sec
  , min(lay) lay
FROM my_table
where lay='1863'
group by shot with rollup;

SQL FiddlewithDemoを参照してください。

現在のクエリは集計を実行していないため、最終的なロールアップ行は正しくありません。

lay列を集計関数に配置したことに気付くでしょう。これは、ほとんどのデータベース製品では、選択リストの列を集計関数内に含めることや、に含めることから除外することを許可していないためgroup byです。

MySQLは、への拡張のためにこれを許可しGROUP BYます。

MySQLドキュメントから:

MySQLはGROUPBYの使用を拡張して、選択リストがGROUPBY句で指定されていない非集計列を参照できるようにします。...この機能を使用すると、不要な列の並べ替えやグループ化を回避して、パフォーマンスを向上させることができます。ただし、これは主に、GROUPBYで指定されていない各非集計列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。さらに、各グループからの値の選択は、ORDERBY句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDERBYはサーバーが選択する値に影響を与えません。

編集:lay最後の行の列の結果を非表示にする場合は、次を使用できます。

SELECT 
  coalesce(Shot,'TOTAL') AS Shot
  , sum(sec) Sec
  , case when shot is not null then min(lay) else '' end lay
FROM my_table
where lay='1863'
group by shot with rollup;

SQL FiddlewithDemoを参照してください

于 2013-03-06T11:14:04.730 に答える
1

GROUP BYは集計用です。秒の合計が必要な場合は、合計を要求する必要があります。

SELECT
    IFNULL(Shot,'TOTAL') AS Shot
    , sum(sec)
    , max(lay)
    FROM my_table
    WHERE lay='1863'
    GROUP BY shot WITH ROLLUP;

http://sqlfiddle.com/#!2/1f61b/49

于 2013-03-06T11:15:53.093 に答える
1

これを試して

  SELECT 
  IFNULL(Shot,'TOTAL') AS Shot
 , sum(sec) as sec
 , lay
 FROM my_table
 where lay='1863'
 group by shot with rollup;

デモはこちら

合計でフィールドの数もカウントする可能性があるため、TOTALの行数をカウントすることを検討してくださいそのように

 SELECT 
 IFNULL(Shot,'TOTAL') AS Shot
 , sum(sec) as sec
 , if(Shot is null , count(*) , lay) lay
 FROM my_table
 where lay='1863'
 group by shot with rollup;

デモはこちら

空にしたい場合は、次のように置き換えcount(*)てください''

于 2013-03-06T11:16:35.167 に答える
1

これは、 groupbyaggregateのMySQL組み込み関数のリストです。

AVG() Return the average value of the argument
BIT_AND() Return bitwise and
BIT_OR()  Return bitwise or
BIT_XOR()(v4.1.1) Return bitwise xor
COUNT(DISTINCT)   Return the count of a number of different values
COUNT()   Return a count of the number of rows returned
GROUP_CONCAT()(v4.1)  Return a concatenated string
MAX() Return the maximum value
MIN() Return the minimum value
STD() Return the population standard deviation
STDDEV_POP()(v5.0.3)  Return the population standard deviation
STDDEV_SAMP()(v5.0.3) Return the sample standard deviation
STDDEV()  Return the population standard deviation
SUM() Return the sum
VAR_POP()(v5.0.3) Return the population standard variance
VAR_SAMP()(v5.0.3)    Return the sample variance
VARIANCE()(v4.1)  Return the population standard variance

SUM()が欲しいと思います

試す

SELECT 
IFNULL(Shot,'TOTAL') AS Shot
,SUM(sec) AS sec 
, lay
FROM my_table
where lay='1863'
group by shot with rollup;
于 2013-03-06T11:19:15.260 に答える
1

TOTAL行に「lay」列を使用するのはまったく正しくないようです。ここに期待される結果を与えるSQLがあることを除いて:

SELECT Shot, sec, lay FROM my_table WHERE lay = '1863'
UNION
SELECT 'TOTAL' AS Shot, SUM(sec), '' AS lay FROM my_table WHERE lay = '1863';

また、例のように列'Shot'がテーブル内で一意である場合は、次のクエリを使用できます。

SELECT t1.Shot, t1.sec, t2.lay FROM
    (
    SELECT IFNULL(Shot, 'TOTAL') AS Shot, SUM(sec) As sec
    FROM my_table
    WHERE lay = '1863'
    GROUP BY Shot WITH ROLLUP
    ) t1
LEFT JOIN my_table t2
ON(t1.Shot = t2.shot);

そして、これがどんな場合でも機能する解決策です:

SELECT t1.Shot, t1.sec, t1.lay FROM
    (
    SELECT IFNULL(Shot, 'TOTAL') AS Shot, SUM(sec) as sec, lay
    FROM my_table
    WHERE lay = '1863'
    GROUP BY Shot, lay WITH ROLLUP
    ) t1
WHERE t1.lay IS NOT NULL OR t1.Shot = 'TOTAL';
于 2013-03-06T13:35:12.710 に答える
0

これを試して ::

    SELECT     
    Shot,
 sec,
lay   
    FROM my_table
    where lay='1863' and Shot is not null
    group by shot with rollup

    UNION

    SELECT 
   'TOTAL' AS Shot,
 SUM(sec),
 lay
FROM my_table
 where lay='1863'
 group by shot with rollup
于 2013-03-06T11:14:37.937 に答える