2010-10-20 19 views
0

我有一些T-SQL生成一個很好的報告,每個月都會給出一些總結。有關我的SQL腳本的兩個問題。如何添加小計/總計行數和排序問題

我有2個問題,有沒有一種方法來按日曆順序排序月份,而不是通過阿爾法?而且,我想要做的是爲每年添加一條總計行,併爲整個報告添加一條總行數?

SELECT 
    CASE WHEN tmpActivity.Year IS NULL THEN 
     CASE WHEN tmpCreated.Year IS NULL THEN 
      CASE WHEN tmpContactsCreated.Year IS NULL THEN 
       null 
      ELSE tmpContactsCreated.Year END 
     ELSE tmpCreated.Year END 
    ELSE tmpActivity.Year END As Year, 

    CASE WHEN tmpActivity.Month IS NULL THEN 
     CASE WHEN tmpCreated.Month IS NULL THEN 
      CASE WHEN tmpContactsCreated.Month IS NULL THEN 
       null 
      ELSE DateName(month, DateAdd(month, tmpContactsCreated.Month - 1, '1900-01-01')) END 
     ELSE DateName(month, DateAdd(month, tmpCreated.Month - 1, '1900-01-01')) END 
    ELSE DateName(month, DateAdd(month, tmpActivity.Month - 1, '1900-01-01')) END As Month, 

    CASE WHEN tmpActivity.ActiveAccounts IS NULL THEN 0 ELSE tmpActivity.ActiveAccounts END AS ActiveAccounts, 
    CASE WHEN tmpCreated.NewAccounts IS NULL THEN 0 ELSE tmpCreated.NewAccounts END AS NewAccounts, 
    CASE WHEN tmpContactsCreated.NewContacts IS NULL THEN 0 ELSE tmpContactsCreated.NewContacts END AS NewContacts 
FROM 
(
SELECT YEAR(LastLogon) As Year, MONTH(LastLogon) As Month, COUNT(*) As ActiveAccounts 
FROM Users 
WHERE LastLogon >= '1/1/1800' 
GROUP BY YEAR(LastLogon), MONTH(LastLogon) 
) as tmpActivity 

FULL JOIN 
(
SELECT YEAR(Created) As Year, MONTH(Created) As Month, COUNT(*) As NewAccounts 
FROM Users 
WHERE Created >= '1/1/1800' 
GROUP BY YEAR(Created), MONTH(Created) 
) as tmpCreated ON tmpCreated.Year = tmpActivity.Year AND tmpCreated.Month = tmpActivity.Month 

FULL JOIN 
(
SELECT YEAR(Created) As Year, MONTH(Created) As Month, COUNT(*) As NewContacts 
FROM Contacts 
WHERE Created >= '1/1/1800' 
GROUP BY YEAR(Created), MONTH(Created) 
) as tmpContactsCreated ON tmpContactsCreated.Year = tmpCreated.Year AND tmpContactsCreated.Month = tmpCreated.Month 

Order By Year DESC, Month DESC 

回答

2

要在這個月使用順序如下:

ORDER BY DATEPART(Month,Created) ASC 

DatePart()返回部分的整數指定1月2日,爲Febuary等


你SQL可以通過COALESCE()和ISNULL()函數獲得幫助。這是與您的第一選擇:

SELECT 
    COALESCE(tmpActivity.Year,tmpCreated.Year,tmpContactsCreated.Year) as Year, 
    COALESCE(tmpActivity.Month,tmpCreated.Month,tmpContactsCreated.Month) as Month, 
    ISNULL(tmpActivity.ActiveAccounts,0) AS ActiveAccounts, 
    ISNULL(tmpCreated.NewAccounts,0) AS NewAccounts, 
    ISNULL(tmpContactsCreated.NewContacts,0) AS NewContacts 

我認爲這是在你的選擇中的錯誤,我相信你的最後一行是這樣的:

) as tmpContactsCreated ON (tmpContactsCreated.Year = tmpCreated.Year AND tmpContactsCreated.Month = tmpCreated.Month) OR 
          (tmpContactsCreated.Year = tmpActivity.Year AND tmpContactsCreated.Month = tmpActivity.Month)  

我願意要測試這一點是肯定的。


添加在彙總是很難做到的 - 通常這是在控制外部進行到SQL或任何顯示結果。你可以做這樣的事情(人爲的例子):

SELECT 1 as reportOrder, date, amount, null as total 
FROM invoices 
UNION ALL 
SELECT 2 , null, null, sum(amount) 
FROM invoices 
ORDER BY reportOrder, date 

,或者你可以沒有「額外的」總列,並把它在金額欄。