2013-04-09 56 views
1

我正在使用SQL Server 2008 R2。我有六個表,我從中獲取按創建日期分組的多個行。來自不同表格組的記錄計數總和除以記錄的創建日期

例如:

SELECT COUNT(*) AS NoOfReading FROM TableA 
WHERE IsDeleted = 0 
GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111) 

SELECT COUNT(*) AS NoOfReading FROM TableB 
WHERE IsDeleted = 0 
GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111) 

SELECT COUNT(*) AS NoOfReading FROM TableC 
WHERE IsDeleted = 0 
GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111) 

及以後..

現在,我要讓所有的創建日期表組sum of NoOfReading。任何解決方案

P.S. :我曾嘗試在所有查詢之間使用「+」,但發生錯誤。

感謝

+0

所以你有6個相同的表結構明智?聽起來像是要求工會 – Scotch 2013-04-09 06:28:53

+0

@Scotch - 6個相同的表格告訴我,它應該是一個表,並且有一個額外的列,其中包含當前決定使用哪個相同表的特徵。 – 2013-04-09 06:30:29

+0

我認爲union會刪除具有相同值的記錄。我想按日期製作記錄數量的總和,並且記錄位於不同的表格中。 – Dev 2013-04-09 06:30:54

回答

0

我想簡單的加法可以工作..

select (
    (SELECT COUNT(*) FROM TableA 
    WHERE IsDeleted = 0 
    GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111)) 
    + 
    (SELECT COUNT(*) FROM TableB 
    WHERE IsDeleted = 0 
    GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111)) 
    + 
    (SELECT COUNT(*) FROM TableC 
    WHERE IsDeleted = 0 
    GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111)) 
    ) AS NoOfReadingSum 
+0

錯誤:子查詢返回多個值。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。我想我找到了使用union all的解決方案,然後進行求和。你怎麼看? – Dev 2013-04-09 06:40:02

+0

@Dev是的,你是對的壞對策抱歉:-( – bAN 2013-04-09 06:47:56

+0

嘿..沒關係..我很高興,因爲你們幫助我。非常感謝.. :) – Dev 2013-04-09 07:19:31

0

您可以使用UNION ALL它保留副本:

SELECT COUNT(*) AS NoOfReading FROM 
(
    SELECT CreatedDtUTC,IsDeleted FROM TableA 
    UNION ALL 
    SELECT CreatedDtUTC,IsDeleted FROM TableB 
    UNION ALL 
    SELECT CreatedDtUTC,IsDeleted FROM TableC 
) t 
WHERE IsDeleted = 0 
GROUP BY DATEADD(day,DATEDIFF(day,0,CreatedDtUTC),0) 
+0

錯誤:無效的列名稱'IsDeleted'。所有表中都不存在IsDeleted。 – Dev 2013-04-09 06:45:10

+0

@Dev - 是的,我在一分鐘前意識到我需要包括該專欄。我沒有可用的數據,所以我無法測試查詢。 – 2013-04-09 06:46:55

+0

亞..很抱歉,沒有提供的詳細信息..並感謝幫助我。 – Dev 2013-04-09 07:20:12

0

解決它我的自我:

;WITH MeasurementReadings(NoOfReading, CreatedDtUTC) AS 
(
    SELECT COUNT(*) AS NoOfReading, CreatedDtUTC FROM TableA 
    WHERE IsDeleted = 0 
    GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111) 
    UNION ALL 
    SELECT COUNT(*) AS NoOfReading, CreatedDtUTC FROM TableB 
    WHERE IsDeleted = 0 
    GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111) 
    UNION ALL 
    SELECT COUNT(*) AS NoOfReading, CreatedDtUTC FROM TableC 
    WHERE IsDeleted = 0 
    GROUP BY CONVERT(VARCHAR(10), CreatedDtUTC,111) 
) 
SELECT SUM(NoOfReading) AS NoOfRecords, CreatedDtUTC 
FROM MeasurementReadings 
GROUP BY CreatedDtUTC 

謝謝