SQL Server 2008r2联合所有分组依据
我有以下疑问:SQL Server 2008r2联合所有分组依据,sql,sql-server-2008,Sql,Sql Server 2008,我有以下疑问: SELECT SUM (T0.[TotalSumSy]) AS 'Line Sterling', T0.[WhsCode] AS 'Business Unit' FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry] WHERE T1.[DocDate] > (CONVER
SELECT SUM (T0.[TotalSumSy]) AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[INV1] T0
INNER JOIN [dbo].[OINV] T1
ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
GROUP BY T0.[WhsCode]
UNION ALL
SELECT SUM (T0.[TotalSumSy] * -1) AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[RIN1] T0
INNER JOIN [dbo].[ORIN] T1
ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
GROUP BY T0.[WhsCode]
但是,这将返回2组。我明白为什么,但我不知道如何解决。
有人能帮忙吗?试试以下方法:
select sum([TotalSumSy]), WhsCode AS 'Business Unit' from
(
SELECT TotalSumSy, T0.[WhsCode]
FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
UNION ALL
SELECT
T0.[TotalSumSy]*-1,
T0.[WhsCode]
FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
) x
group by WhsCode
尝试以下方法:
select sum([TotalSumSy]), WhsCode AS 'Business Unit' from
(
SELECT TotalSumSy, T0.[WhsCode]
FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
UNION ALL
SELECT
T0.[TotalSumSy]*-1,
T0.[WhsCode]
FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
) x
group by WhsCode
我建议首先创建一个视图。然后在该视图上应用GROUPBY子句
create view v1 as (
SELECT
T0.[TotalSumSy] AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
UNION ALL
SELECT
T0.[TotalSumSy] * -1 AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
)
然后通过以下方式应用该组:
SELECT
SUM (Line Sterling) AS 'Line Sterling', [Business Unit]
FROM v1
GROUP BY [Business Unit]
我建议首先创建一个视图。然后在该视图上应用GROUPBY子句
create view v1 as (
SELECT
T0.[TotalSumSy] AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
UNION ALL
SELECT
T0.[TotalSumSy] * -1 AS 'Line Sterling',
T0.[WhsCode] AS 'Business Unit'
FROM [dbo].[RIN1] T0 INNER JOIN [dbo].[ORIN] T1 ON T1.[DocEntry] = T0.[DocEntry]
WHERE T1.[DocDate] > (CONVERT(DATETIME, '20121001', 112) )
)
然后通过以下方式应用该组:
SELECT
SUM (Line Sterling) AS 'Line Sterling', [Business Unit]
FROM v1
GROUP BY [Business Unit]
执行此查询还有另一个选项,即只执行一次聚合
select sum("Line Sterling") as [Line Sterling], [Business Unit]
from ((SELECT T0.[TotalSumSy] AS [Line Sterling], T0.[WhsCode] AS [Business Unit], t1.DocDate
FROM [dbo].[INV1] T0 INNER JOIN
[dbo].[OINV] T1
ON T1.[DocEntry] = T0.[DocEntry]
) union all
(SELECT T0.[TotalSumSy] * -1, T0.[WhsCode], t1.DocDate
FROM [dbo].[RIN1] T0 INNER JOIN
[dbo].[ORIN] T1
ON T1.[DocEntry] = T0.[DocEntry]
)
) t
where [DocDate] > CONVERT(DATETIME, '20121001', 112)
group by [Business Unit];
这是否比预聚合、执行联合和再次聚合的性能更好取决于许多因素。然而,这确实将聚合和过滤的逻辑放在了一个地方。这意味着更容易修改和维护查询而不会出错
注意,我还更改了列名的转义字符。单引号只能用于字符串和日期常量。将它们用于标识符(列别名)可能会导致查询中难以检测错误。执行此查询还有另一个选项,即仅执行一次聚合
select sum("Line Sterling") as [Line Sterling], [Business Unit]
from ((SELECT T0.[TotalSumSy] AS [Line Sterling], T0.[WhsCode] AS [Business Unit], t1.DocDate
FROM [dbo].[INV1] T0 INNER JOIN
[dbo].[OINV] T1
ON T1.[DocEntry] = T0.[DocEntry]
) union all
(SELECT T0.[TotalSumSy] * -1, T0.[WhsCode], t1.DocDate
FROM [dbo].[RIN1] T0 INNER JOIN
[dbo].[ORIN] T1
ON T1.[DocEntry] = T0.[DocEntry]
)
) t
where [DocDate] > CONVERT(DATETIME, '20121001', 112)
group by [Business Unit];
这是否比预聚合、执行联合和再次聚合的性能更好取决于许多因素。然而,这确实将聚合和过滤的逻辑放在了一个地方。这意味着更容易修改和维护查询而不会出错
注意,我还更改了列名的转义字符。单引号只能用于字符串和日期常量。使用它们作为标识符(列别名)可能导致查询中难以检测错误。无需查看。仅为一个查询创建视图不是一个好主意。不需要视图。仅为一个查询创建视图不是一个好主意。谢谢。我觉得你的问题更容易理解。然而,我有以下错误。Msg 8120,级别16,状态1,第7行列“dbo.RIN1.WhsCode”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。@user2694771。我在第二个子查询中保留了
sum()
,这将它转换为一个聚合。现在修好了,谢谢。我觉得你的问题更容易理解。然而,我有以下错误。Msg 8120,级别16,状态1,第7行列“dbo.RIN1.WhsCode”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。@user2694771。我在第二个子查询中保留了sum()
,这将它转换为一个聚合。现在修好了,谢谢。第一个选择应该给我+值和第二个-值,因为它们是积分。总和将始终为+值(第一次选择-第二次选择)。然而,结果显示了所有的价值谢谢你。第一个选择应该给我+值和第二个-值,因为它们是积分。总和将始终为+值(第一次选择-第二次选择)。然而,结果显示了所有的价值观