2016-12-01 97 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

相關問題