如果這會影響到全表中的任何內容,我將 3 個不同格式的子表與聯合連接在一起。我有列“位置”、“金額”和“時間”。然后為了保持我以后需要的通用性,我將完整表與具有所有可能的“位置”值的位置表合并,其他欄位為空到主表中。
我查詢主表,
select location, sum(amount)
from master-table
where (time...)
group by location
然而,一些“位置”值被洗掉,因為這些“位置”的 sum(amount) 為 0,但我真的希望有這些“位置”的完整串列以供我進一步的步驟。
另一種選擇是使用 HAVING 子句,但據我了解,在這里 HAVING 是不可能的,因為我在“位置”分組時過濾“時間”,我需要在分組中添加“時間”,這會破壞目的。請記住,這里的目標是在每個“位置”中獲取總和(金額)
select location, sum(amount)
from master-table
group by location, time
having (time...)
查看輸出:使用我得到的第一個代碼
loc1, 5
loc3, 10
loc6, 1
但我想得到
loc1, 5
loc2, 0
loc3, 10
loc4, 0
loc5, 0
loc6, 1
關于這種主表結構可以做什么的任何建議?我不知道如何編碼的替代解決方案是將第一個查詢結果中的數字添加到位置表(作為查詢,而不是實際表)以及我在上面發布的最終結果查詢。
uj5u.com熱心網友回復:
您想要的將需要一個完整的位置串列,然后使用該表和您的計算值進行左外連接,以及 IsNull(用于 tsql)以確保您看到預期的 0。您可以使用一些 CTE 來執行此操作,我認為這對于在開發程序中的清晰性很有價值,或者您可以在更傳統的 SELECT...FROM... 陳述句中“將它們放在一起”。CTE 方法可能如下所示:
WITH loc AS (
SELECT DISTINCT LocationID
FROM location_table
), summary_data as (
SELECT LocationID, SUM(amount) AS location_sum
FROM master-table
GROUP BY LocationID
)
SELECT loc.LocationID, IsNull(location_sum,0) AS location_sum
FROM loc
LEFT OUTER JOIN summary_data ON loc.LocationID = summary_data.LocationID
看看這是否能讓你更接近你正在尋找的結果。
uj5u.com熱心網友回復:
我可以想到2個選項:
您可以將 WHERE 移至 CASE WHEN 構造:
-- Option 1
select
location,
sum(CASE WHEN time <'16:00' THEN amount ELSE 0 END)
from master_table
group by location
或者你可以加入可能的值location(這是我很長一段時間以來的第一次 RIGHT JOIN ??):
-- Option 2
select
x.location,
sum(CASE WHEN m.time <'16:00' THEN m.amount ELSE 0 END)
from master_table m
right join (select distinct location from master_table) x ON x.location = m.location
group by x.location
見:DBFIDDLE
uj5u.com熱心網友回復:
使用沒有 CTE 的 T-SQL 的版本是:
SELECT l.location ,
ISNULL(m.location_sum, 0) as location_sum
FROM master-table l
LEFT JOIN (
SELECT location,
SUM(amount) as location_sum
FROM master-table
WHERE (time ... )
GROUP BY location
) m ON l.location = m.location
這假設您仍然擁有初始 UNION 以確保master-table包含所有可能的位置。
uj5u.com熱心網友回復:
它where clause不包括某些位置。為了確保您保留每個位置,您可以引入“條件聚合”而不是使用 where 子句:例如
select location, sum(case when (time...) then amount else 0 end) as location_sum
from master-table
group by location
即,不要從結果中排除某些行,而是將條件放在 sum 函式中,這些條件等同于您在 where 子句中使用的條件。如果這些條件為真,那么它將聚合金額,但如果條件評估為假,則求和 0,但該位置將保留在結果中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492715.html
