2013-03-06 156 views
1

我有一個樣本table這裏在SQL小提琴。如何獲得一列的總和

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的Shots。並在秒的底部得到總數。

結果是錯誤的。任何人都可以指導我。

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  
+0

你的意思是錯的?你想要什麼結果? – 2013-03-06 11:08:12

+0

您的預期成果是什麼? – 2013-03-06 11:11:00

回答

2

的問題是使用的是GROUP BY沒有聚合函數。在您當前的查詢中,您沒有在sec列上使用sum(),這是您要彙總的列。嘗試使用:

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

請參閱SQL Fiddle with Demo

您當前的查詢未執行任何聚合,因此最終的彙總行不正確。

你會發現,我把lay列在聚合函數。這是因爲大多數數據庫產品不允許將選擇列表中的列排除在集合函數內或包含在group by中。

MySQL允許這是因爲一個Extension to GROUP BY

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

編輯:如果你想隱藏結果在最後一行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 Fiddle with Demo

+0

UI不認爲我們需要min(lay)lay。你能告訴我你爲什麼使用它嗎?螞蟻如何感謝答案,因爲我學習了新的函數'coalesce' – Rao 2013-03-06 11:21:21

+0

@PBLNarasimhaRao MySQL並不要求它在一個聚合,但我添加了聚合,所以這個查詢將在MySQL以外的工作。 :) – Taryn 2013-03-06 11:26:46

+0

在最後一行最後一列(躺)旁邊7.75顯示1863年,我不想顯示。你能告訴如何避免它。 – Rao 2013-03-06 11:27:51

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 
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

+0

在7.75旁邊的最後一列(lay)顯示1863.我不想顯示。你能告訴如何避免它。 – Rao 2013-03-06 11:28:47

+0

@PBLNarasimhaRao將'max(lay)'替換爲'(CASE當鏡頭不是NULL,那麼max(lay)ELSE''END)'。 – 2013-03-06 11:33:52

1

試試這個

DEMO HERE

編輯 你可以考慮來算多少行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; 

DEMO HERE

,如果你想成爲空只是''

+0

在7.75旁邊的最後一行最後一列(放置)顯示1863.我不想顯示。你能告訴如何避免它。 – Rao 2013-03-06 11:29:05

+0

看看我編輯的答案可能會幫助你 – 2013-03-06 11:38:08

+0

,因爲我認爲它更好,如果你也計算總共有多少個字段。 – 2013-03-06 11:41:02

1

Here更換count(*)是建立在功能組的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; 
+0

在7.75旁邊的最後一列最後一列(lay)顯示1863.我不想顯示。你能告訴如何避免它。 – Rao 2013-03-06 11:28:32

+0

嘗試 SELECT 聚結(射擊,「總計」)AS拍攝 ,總和(秒)二段 ,情況下,當拍攝不爲空則分鐘(鋪設)否則「」末端躺在 FROM MY_TABLE 其中鋪設=」 1863' group by shot with rollup; – 2013-03-06 11:34:54

1

在所有它看起來不正確使用「奠定」了TOTAL行列。除此之外,這裏是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'; 
的情況下,

此外,如果列「射擊」將是一個表中是唯一的例子中,將有可能使用一個查詢:

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'; 
+0

不要忘記在代碼中發佈時使用「格式代碼」按鈕{} =) – Raad 2013-03-06 13:54:36