2013-02-18 21 views
1

表結構如下。第一個表是subusage,接下來是machineubusage.Both與sub_usage_id列關聯。我需要選擇subusage.product_key及其相關的使用計數,如果subusage.is_standalone不爲null,那麼我需要從subusage.usage_count中獲取關聯的使用計數,否則關聯的使用計數將是該子sub_usage_id的machinesubusage表中的行數。我已經爲以下兩種情況撰寫了查詢。我想情況下,如果聲明這兩個查詢組合,卻徒勞無功我有兩個通過某個鍵關聯的表。我需要編寫一個查詢來根據一定的條件從這兩個表中獲取數據。

SELECT SU.product_key,COUNT(*) FROM SubUsage SU 
INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 GROUP BY SU.product_key 

SELECT SU.product_key, SU.usage_count FROM SubUsage SU 
INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 GROUP BY SU.product_key, SU.usage_count 

表的結構:

enter image description here

+0

你試過的情況陳述是什麼,你不喜歡它的是什麼? – 2013-02-18 12:52:43

+0

SELECT SU.product_key, \t CASE WHEN SU.is_standalone IS NOT NULL THEN SU.usage_count \t ELSE COUNT(*)END \t FROM SubUsage SU INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id WHERE SU。 acct_id = 40897342 GROUP BY SU.product_key,SU.usage_count這些行上的東西,但我知道這是錯誤的,甚至不會編譯。 – almighty 2013-02-18 12:59:53

回答

1

試試這個:

SELECT 
    SU.product_key, 
    SUM(CASE 
     WHEN su.is_standalone IS NOT NULL THEN su.usage_count 
     ELSE MSU.SubUsageCount 
     END) AS TotalCount 
FROM SubUsage SU 
INNER JOIN 
(
    SELECT sub_usage_id, COUNT(*) AS SubUsageCount 
    FROM MachineSubUsage 
    GROUP BY sub_usage_id 
) AS MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
GROUP BY SU.product_key; 

如果您需要包括那些在另一個表中沒有匹配的產品密鑰,請使用LEFT JOIN而不是ISNULL()將空值替換爲零:

SELECT 
    SU.product_key, 
    SUM(CASE 
     WHEN su.is_standalone IS NOT NULL THEN su.usage_count 
     ELSE ISNULL(MSU.SubUsageCount, 0) 
     END) AS TotalCount 
FROM SubUsage SU 
LEFT JOIN 
(
    SELECT sub_usage_id, COUNT(*) AS SubUsageCount 
    FROM MachineSubUsage 
    GROUP BY sub_usage_id 
) AS MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
GROUP BY SU.product_key; 
+0

你不需要做一個SUM,你的子查詢已經有了這些數據。 – twoleggedhorse 2013-02-18 13:03:45

+0

@twoleggedhorse是的,如果第二個表中每個'sub_usage_id'只有一個條目,那麼你是對的。但是如果每一行有多行,那麼你需要對它們進行計數,在這種情況下計數將是兩次計數的總和。不確定如果這是他正在尋找或沒有。等待OP來決定。 – 2013-02-18 13:06:25

+0

machinesubusage表中將有多個sub_usage_id條目。 – almighty 2013-02-18 13:40:55

0

在SQLServer2005的+試試這個請求

SELECT DISTINCT SU.product_key, SU.usage_count, 
     COUNT(*) OVER(PARTITION BY SU.product_key) 
FROM SubUsage SU JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
0

馬哈茂德·賈邁勒已發佈這似乎是一個很好的答案。我將解釋amit評論中原始案例陳述出了什麼問題。在這裏它是:

SELECT SU.product_key 
, CASE WHEN SU.is_standalone IS NOT NULL THEN SU.usage_count ELSE COUNT(*) END 
FROM SubUsage SU INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
GROUP BY SU.product_key, SU.usage_count 

的問題,應在該錯誤消息已顯示時,是SU.is_standalone被包括在選擇子句中但不是group by子句英寸事實上,如果你做了這個簡單的更正,你可能會得到你所尋求的答案。

相關問題