2016-12-01 102 views
-2

我需要创建QUERY以返回每辆车的总计。这里的每个关键都是一次购买,而这些购买可以在“表头”表格或“行数”表格中具有车辆ID,因为购买可以仅用于一辆车,或者用于许多车辆。是否有可能得到如下所示的结果表格?SQL QUERY对于来自两个不同表格的总计

页眉:

╔═════╦════════╦═══════╗ 
║ Key ║ Total ║ Car ║ 
╠═════╬════════╬═══════╣ 
║ 1 ║ 100.00 ║ Car 1 ║ 
║ 2 ║ 350.00 ║  ║ 
║ 3 ║ 230.24 ║ Car 1 ║ 
║ 4 ║ 121.01 ║ Car 2 ║ 
║ 5 ║ 110.00 ║  ║ 
╚═════╩════════╩═══════╝ 

线:

╔═════╦══════╦═══════════╦═══════╗ 
║ Key ║ Line ║ LineTotal ║ Car ║ 
╠═════╬══════╬═══════════╬═══════╣ 
║ 1 ║ 0 ║ 100.00 ║  ║ 
║ 2 ║ 0 ║ 350.00 ║ Car 2 ║ 
║ 3 ║ 0 ║ 30.24  ║ Car 1 ║ 
║ 3 ║ 1 ║ 200.00 ║ Car 1 ║ 
║ 4 ║ 0 ║ 121.01 ║  ║ 
║ 5 ║ 0 ║ 10.00  ║ Car 1 ║ 
║ 5 ║ 1 ║ 100.00 ║ Car 2 ║ 
╚═════╩══════╩═══════════╩═══════╝ 

结果:

╔═══════╦════════╦═════╗ 
║ Car ║ Value ║ Key ║ 
╠═══════╬════════╬═════╣ 
║ Car 1 ║ 100.00 ║ 1 ║ 
║ Car 1 ║ 230.24 ║ 3 ║ 
║ Car 1 ║ 10.00 ║ 5 ║ 
║ Car 2 ║ 350.00 ║ 2 ║ 
║ Car 2 ║ 121.01 ║ 4 ║ 
║ Car 2 ║ 100.00 ║ 5 ║ 
╚═══════╩════════╩═════╝ 

回答

0

在这里你去:

SELECT A.Car, SUM(A.Total), A.Key 
FROM HEADER A 
GROUP BY A.Car,A.Key 

UNION 

SELECT B.Car, SUM(B.LineTotal), B.Key 
FROM LINES B 
GROUP BY B.Car,B.Key 
+0

谢谢!像魅力一样工作! –

+0

詹姆斯或马丁 - 很难分辨 – scsimon

+1

@scsimon我敢打赌!他的粉丝! –

1
SELECT 
    ISNULL(l.Car,h.Car) as Car 
    ,SUM(l.LineTotal) AS Value 
    ,l.[Key] 
FROM 
    Lines l 
    INNER JOIN Header h 
    ON l.[Key] = h.[Key] 
GROUP BY 
    ISNULL(l.Car,h.Car) 
    ,l.[Key] 
ORDER BY 
    ISNULL(l.Car,h.Car) 
    ,l.[Key] 

如果空白实际上是空字符串,而不是NULL,那么你只需要稍微改变最多是这样的:

SELECT 
    ISNULL(NULLIF(l.Car,''),h.Car) as Car 
    ,SUM(l.LineTotal) AS Value 
    ,l.[Key] 
FROM 
    @Lines l 
    INNER JOIN @Header h 
    ON l.[Key] = h.[Key] 
GROUP BY 
    ISNULL(NULLIF(l.Car,''),h.Car) 
    ,l.[Key] 
ORDER BY 
    ISNULL(NULLIF(l.Car,''),h.Car) 
    ,l.[Key] 
+0

您只需要总和'Lines.Value',所以在这种情况下,'Header'中的Total将被排除。所以你只会从'Lines'得到数据,但是没有来自'Header'的数据。 – AVK

+0

@AVKNaidu Total From Header是当车辆在标题级别已知时的SUM(Lines.LineTotal)。所以,当你SUM(Lines.LineTotal)它仍然会正确地 – Matt

+0

这是正确的。但是,如果你看到Table'Header'有一个值为100的键1,所以当你Sum(Lines.LineTotal)时,你是键3和键5的关系,但不是1.哪一个也应该是结果集的一部分。 – AVK

-1

解决方案:

select distinct * from 
(select 
    c.car, 
    sum(c.value) as Total, 
    c.[key] 
from 
(select 
    h.Car as car, h.Total as value, h.[key] as [key] 
from header as h where car <> '') 
as c 
group by c.car, c.[key] 
union all 
select 
    c.car, 
    sum(c.value) as Total, 
    c.[key] 
from 
(
select 
    l.Car as car, l.LineTotal as value, l.[key] as [key] 
from lines as l where car <> '') 
as c 
group by c.car, c.[key]) 
as c 
order by c.car, c.[key] 

但是你可以改善你的表,把更好的关系

1

假设密钥Header总是唯一的,键的总和是从Lines最终输出,下面是如何你可以做这个。

;with cte (Car,Value,[Key]) as 
(
    select Car,Total,[Key] from Header 
    union 
    select Car,sum(LineTotal),[Key] from Lines group by [Key],Car 
) 
select Car,Value,[Key] from cte where isnull(car,'')!='' order by Car,[Key] 
0

对我来说似乎是一个简单的连接聚合和组应该工作。以及合并选择正确的汽车价值。

  1. 首先,我们将Header加入到Key上。
  2. 接下来我们取第一个非空值来获取汽车开始行的值,然后转到标题。
  3. 然后,我们总结行中的值,对于给定的钥匙和汽车,可能有多行。
  4. 我们根据汽车和l.key的值(选择中的非聚合值)分组
  5. 最后我们按汽车值排序,然后按默认(Asc)顺序排序。

合并返回一系列值中的第一个非空值,并且一旦找到值就可以提前退出。它要求所有的值都是相同的数据类型。

SELECT Coalesce(L.car, H.car) as Car 
    , sum(L.value) as value 
    , L.Key 
FROM Header H 
INNER JOIN Lines L 
on H.Key = L.Key 
GROUP BY Coalesce(L.car, H.car), L.Key 
ORDER BY Coalesce(L.car, H.car), L.Key 
+0

您只计算'Lines.Value'的总和,因此在这种情况下,'Header'中的'Total'将被排除。所以你只能从'Lines'得到数据,而不能从'Header'得到数据 – AVK

相关问题