Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server Group By子句_Sql_Sql Server - Fatal编程技术网

SQL Server Group By子句

SQL Server Group By子句,sql,sql-server,Sql,Sql Server,这是D009022表格的示例输出 LBrCode PrdAcctId 1 20060000000001420000000100000000 1 20060003002891900000000100000000 1 20060004001110490000000100000000 我使用这个查询来计算每种产品的总计 SELECT A.LBrCode AS BranchCode, (SELECT B.Name FROM D001003 B W

这是D009022表格的示例输出

LBrCode PrdAcctId
1       20060000000001420000000100000000
1       20060003002891900000000100000000
1       20060004001110490000000100000000
我使用这个查询来计算每种产品的总计

SELECT 
    A.LBrCode AS BranchCode, 
    (SELECT B.Name FROM D001003 B WHERE A.LBrCode = B.PBrCode) AS BranchName,
    substring(A.PrdAcctId,1,8) AS ProductCode,
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060000' 
            THEN count(substring(A.PrdAcctId,1,8)) 
     END) AS Miulasi,
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060001' 
            THEN count(substring(A.PrdAcctId,1,8)) 
     END) AS Piripun,
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060002' 
            THEN count(substring(A.PrdAcctId,1,8)) 
     END) AS Prime,
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060003' 
            THEN count(substring(A.PrdAcctId,1,8)) 
     END) AS Sipsaviya,
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060004' 
            THEN count(substring(A.PrdAcctId,1,8)) 
     END) AS Yalu,
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060007' 
            THEN count(substring(A.PrdAcctId,1,8)) 
     END) AS Company,
    SUM(substring(A.PrdAcctId,1,8)) AS AccTotal 
FROM 
    D009022 A
WHERE 
    A.AcctStat<>3 AND
    substring(A.PrdAcctId, 1, 8)='20060000'
    OR substring(A.PrdAcctId, 1, 8)='20060001'
    OR substring(A.PrdAcctId, 1, 8)='20060002'
    OR substring(A.PrdAcctId, 1, 8)='20060003'
    OR substring(A.PrdAcctId, 1, 8)='20060004'
    OR substring(A.PrdAcctId, 1, 8)='20060007'
GROUP BY 
    A.LBrCode, substring(A.PrdAcctId, 1, 8)
ORDER BY 
    A.LBrCode, substring(A.PrdAcctId, 1, 8)
如何显示每个BranchCode的结果?每个分支只有一行。

计数应位于case语句的顶部

SELECT A.LBrCode                         AS BranchCode,
       (SELECT B.Name
        FROM   D001003 B
        WHERE  A.LBrCode = B.PBrCode)    AS BranchName,
       Substring(A.PrdAcctId, 1, 8)      AS ProductCode,
       Count(CASE
               WHEN Substring(A.PrdAcctId, 1, 8) = '20060000' THEN Substring(A.PrdAcctId, 1, 8)
             END)                        AS Miulasi,
       Count(CASE
               WHEN Substring(A.PrdAcctId, 1, 8) = '20060001' THEN Substring(A.PrdAcctId, 1, 8)
             END)                        AS Piripun,
       Count(CASE
               WHEN Substring(A.PrdAcctId, 1, 8) = '20060002' THEN Substring(A.PrdAcctId, 1, 8)
             END)                        AS Prime,
       Count(CASE
               WHEN Substring(A.PrdAcctId, 1, 8) = '20060003' THEN Substring(A.PrdAcctId, 1, 8)
             END)                        AS Sipsaviya,
       Count(CASE
               WHEN Substring(A.PrdAcctId, 1, 8) = '20060004' THEN Substring(A.PrdAcctId, 1, 8)
             END)                        AS Yalu,
       Count(CASE
               WHEN Substring(A.PrdAcctId, 1, 8) = '20060007' THEN Substring(A.PrdAcctId, 1, 8)
             END)                        AS Company,
       Sum(Substring(A.PrdAcctId, 1, 8)) AS AccTotal
FROM   D009022 A
WHERE  A.AcctStat <> 3
       AND Substring(A.PrdAcctId, 1, 8) IN ( '20060000', '20060001', '20060002', '20060003',
                                             '20060004', '20060007' )
GROUP  BY A.LBrCode,
          Substring(A.PrdAcctId, 1, 8)
ORDER  BY A.LBrCode,
          Substring(A.PrdAcctId, 1, 8) 
这本书可读性更强

WITH cte
     AS (SELECT A.LBrCode                      AS BranchCode,
                (SELECT B.Name
                 FROM   D001003 B
                 WHERE  A.LBrCode = B.PBrCode) AS BranchName,
                Substring(A.PrdAcctId, 1, 8)   AS ProductCode,
                A.PrdAcctId
         FROM   D009022 A
         WHERE  A.AcctStat <> 3
                AND Substring(A.PrdAcctId, 1, 8) IN ( '20060000', '20060001', '20060002', '20060003',
                                                      '20060004', '20060007' ))
SELECT BranchCode,
       BranchName,
       ProductCode,
       Count(CASE
               WHEN ProductCode = '20060000' THEN ProductCode
             END)     AS Miulasi,
       Count(CASE
               WHEN ProductCode = '20060001' THEN ProductCode
             END)     AS Piripun,
       Count(CASE
               WHEN ProductCode = '20060002' THEN ProductCode
             END)     AS Prime,
       Count(CASE
               WHEN ProductCode = '20060003' THEN ProductCode
             END)     AS Sipsaviya,
       Count(CASE
               WHEN ProductCode = '20060004' THEN ProductCode
             END)     AS Yalu,
       Count(CASE
               WHEN ProductCode = '20060007' THEN ProductCode
             END)     AS Company,
       Sum(ProductCode) AS AccTotal
FROM   cte
GROUP  BY LBrCode,
          BranchName,
          ProductCode
ORDER  BY LBrCode,
          ProductCode 
这会奏效的。 您可以在MAX函数中编写SubstringA.PrdAcctId,1,8,因为它对于每个代码都是唯一的。因为MAX10=10,所以它不会改变输出

   SELECT A.LBrCode                         AS BranchCode,
   (SELECT B.Name
    FROM   D001003 B
    WHERE  A.LBrCode = B.PBrCode
   )    AS BranchName,
   MAX(Substring(A.PrdAcctId, 1, 8))      AS ProductCode,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060000' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Miulasi,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060001' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Piripun,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060002' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Prime,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060003' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Sipsaviya,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060004' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Yalu,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060007' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Company,
   Sum(Substring(A.PrdAcctId, 1, 8)) AS AccTotal 
FROM   D009022 A
WHERE  A.AcctStat <> 3
   AND Substring(A.PrdAcctId, 1, 8) IN ( '20060000', '20060001', '20060002','20060003','20060004', '20060007' )
GROUP  BY A.LBrCode
ORDER  BY A.LBrCode 

只使用GROUP BY A.LBrCode怎么样?它说PRDACTID'在选择列表中无效,因为它不包含在聚合函数中。如果您还想选择非计数列,这是不可能的。想象一下,如果按此分组,每个LBrCode只能得到一条记录。如何检索分支名称和产品id。BrnachCode、BranchName和ProductCode之间是否存在一对一映射?如果是的话,那么为什么只按LbrCode进行分组呢!?还有什么地方我可以只使用LBrCode进行分组吗?@DeEDEe-那么你需要从select中删除ProductCode
   SELECT A.LBrCode                         AS BranchCode,
   (SELECT B.Name
    FROM   D001003 B
    WHERE  A.LBrCode = B.PBrCode
   )    AS BranchName,
   MAX(Substring(A.PrdAcctId, 1, 8))      AS ProductCode,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060000' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Miulasi,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060001' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Piripun,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060002' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Prime,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060003' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Sipsaviya,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060004' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Yalu,
   Count(CASE
           WHEN Substring(A.PrdAcctId, 1, 8) = '20060007' THEN Substring(A.PrdAcctId, 1, 8)
         END)                        AS Company,
   Sum(Substring(A.PrdAcctId, 1, 8)) AS AccTotal 
FROM   D009022 A
WHERE  A.AcctStat <> 3
   AND Substring(A.PrdAcctId, 1, 8) IN ( '20060000', '20060001', '20060002','20060003','20060004', '20060007' )
GROUP  BY A.LBrCode
ORDER  BY A.LBrCode