SQL Server Group By子句
这是D009022表格的示例输出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
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