【问题标题】:How to select a new column contains selected table?如何选择包含选定表的新列?
【发布时间】:2018-08-13 10:43:43
【问题描述】:

如何选择一个包含选中表的新列?我尝试这样做,但它返回错误说(#1242 - 子查询返回超过 1 行)

SELECT 
(SELECT SUM(A+AA+AB+AC+AD+AE+AF+AG+AH+AI+AJ+AK+AL+AM+AN+AO+
        B+C+CL+D+E+F+G+H+I+J+K+L+LK+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z) 
        AS SELESAI
        FROM statistik WHERE stastus = '1' GROUP BY kategori ),

SUM(A+AA+AB+AC+AD+AE+AF+AG+AH+AI+AJ+AK+AL+AM+AN+AO+
    B+C+CL+D+E+F+G+H+I+J+K+L+LK+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z) 
    AS Jumlah,kategori, 
SUM(A) AS A, 
SUM(AA) AS AA, 
SUM(AB) AS AB, 
SUM(AC) AS AC, 
SUM(AD) AS AD, 
SUM(AE) AS AE, 
SUM(AF) AS AF, 
SUM(AG) AS AG, 
SUM(AH) AS AH, 
SUM(AI) AS AI, 
SUM(AJ) AS AJ, 
SUM(AK) AS AK, 
SUM(AL) AS AL, 
SUM(AM) AS AM, 
SUM(AN) AS AN, 
SUM(AO) AS AO, 
SUM(B) AS B, 
SUM(C) AS C, 
SUM(CL) AS CL, 
SUM(D) AS D, 
SUM(E) AS E, 
SUM(F) AS F, 
SUM(G) AS G, 
SUM(H) AS H, 
SUM(I) AS I, 
SUM(J) AS J, 
SUM(K) AS K, 
SUM(L) AS L, 
SUM(LK) AS LK,
SUM(M) AS M, 
SUM(N) AS N, 
SUM(O) AS O, 
SUM(P) AS P, 
SUM(Q) AS Q, 
SUM(R) AS R, 
SUM(S) AS S, 
SUM(T) AS T, 
SUM(U) AS U, 
SUM(V) AS V, 
SUM(W) AS W, 
SUM(X) AS X, 
SUM(Y) AS Y, 
SUM(Z) AS Z 
FROM statistik WHERE stastus = '4' GROUP BY kategori ;

这是我的数据库:

-- 表statistik的表结构

CREATE TABLE `statistik` (
  `id` int(100) NOT NULL,
  `kategori` varchar(100) DEFAULT NULL,
  `stastus` int(100) DEFAULT NULL,
  `tarikhLaporan` date DEFAULT NULL,
  `A` int(2) NOT NULL,
  `AA` int(2) NOT NULL,
  `AB` int(2) NOT NULL,
  `AC` int(2) NOT NULL,
  `AD` int(2) NOT NULL,
  `AE` int(2) NOT NULL,
  `AF` int(2) NOT NULL,
  `AG` int(2) NOT NULL,
  `AH` int(2) NOT NULL,
  `AI` int(2) NOT NULL,
  `AJ` int(2) NOT NULL,
  `AK` int(2) NOT NULL,
  `AL` int(2) NOT NULL,
  `AM` int(2) NOT NULL,
  `AN` int(2) NOT NULL,
  `AO` int(2) NOT NULL,
  `B` int(2) NOT NULL,
  `C` int(2) NOT NULL,
  `CL` int(2) NOT NULL,
  `D` int(2) NOT NULL,
  `E` int(2) NOT NULL,
  `F` int(2) NOT NULL,
  `G` int(2) NOT NULL,
  `H` int(2) NOT NULL,
  `I` int(2) NOT NULL,
  `J` int(2) NOT NULL,
  `K` int(2) NOT NULL,
  `L` int(2) NOT NULL,
  `LK` int(2) NOT NULL,
  `M` int(2) NOT NULL,
  `N` int(2) NOT NULL,
  `O` int(2) NOT NULL,
  `P` int(2) NOT NULL,
  `Q` int(2) NOT NULL,
  `R` int(2) NOT NULL,
  `S` int(2) NOT NULL,
  `T` int(2) NOT NULL,
  `U` int(2) NOT NULL,
  `V` int(2) NOT NULL,
  `W` int(2) NOT NULL,
  `X` int(2) NOT NULL,
  `Y` int(2) NOT NULL,
  `Z` int(2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 转储表statistik的数据

INSERT INTO `statistik` (`id`, `kategori`, `stastus`, `tarikhLaporan`, `A`, `AA`, `AB`, `AC`, `AD`, `AE`, `AF`, `AG`, `AH`, `AI`, `AJ`, `AK`, `AL`, `AM`, `AN`, `AO`, `B`, `C`, `CL`, `D`, `E`, `F`, `G`, `H`, `I`, `J`, `K`, `L`, `LK`, `M`, `N`, `O`, `P`, `Q`, `R`, `S`, `T`, `U`, `V`, `W`, `X`, `Y`, `Z`) VALUES
(8, 'a', 4, '2018-08-17', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(9, 'b', 4, '2018-08-17', 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(10, 'b', 1, '2018-08-17', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(11, 'b', 1, '2018-08-17', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(12, 'b', 1, '2018-08-17', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(13, 'b', 1, '2018-08-17', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(14, 'b', 1, '2018-08-17', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(15, 'b', 1, '2018-08-17', 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(16, 'bc', 4, '2018-08-17', 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(17, 'c', 1, '2018-08-23', 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(18, 'c', 1, '2018-08-23', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(19, 'c', 1, '2018-08-23', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(20, 'z', 4, '2018-08-11', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(21, 'z', 1, '2018-08-11', 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(22, '', 1, '0000-00-00', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(23, '', 1, '0000-00-00', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

-- 转储表的索引

-- 表statistik的索引

ALTER TABLE `statistik`
  ADD PRIMARY KEY (`id`),
  ADD KEY `stastus` (`stastus`);

-- 转储表的 AUTO_INCREMENT

-- 表statistik的AUTO_INCREMENT

ALTER TABLE `statistik`
  MODIFY `id` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;

【问题讨论】:

  • 推荐TINYINT 而不是INT(2) 没有任何意义。

标签: mysql sql innodb


【解决方案1】:

顶部嵌套选择只能返回一个值。它根本不应该是一个嵌套查询。最好在每个总和中添加一个案例陈述

(SUM(case when stastus = '1' then A+AA+AB+AC+AD+AE+AF+AG+AH+AI+AJ+AK+AL+AM+AN+AO+
    B+C+CL+D+E+F+G+H+I+J+K+L+LK+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z else 0 end) 
    AS SELESAI,

并让所有其他的都使用这种格式。

sum(case when stastus='4' then A else 0 end) as A

否则,您可以使用连接或联合在一起的多个查询进行重构。

【讨论】:

    【解决方案2】:

    虽然我更喜欢@TomC 的方法,但您可以使用 correlated 子查询而不是group by

    SELECT (SELECT SUM(A+AA+AB+AC+AD+AE+AF+AG+AH+AI+AJ+AK+AL+AM+AN+AO+
            B+C+CL+D+E+F+G+H+I+J+K+L+LK+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z) 
                      ) AS SELESAI
            FROM statistik s2
            WHERE s2.status = 1 
                  s2.kategori = s.kategori
           ),
           . . .
    FROM statistik s
    . . .
    

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2012-03-10
      • 2021-09-15
      • 2021-12-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2018-10-28
      • 2021-11-01
      相关资源
      最近更新 更多