0

我有一些 T-SQL 可以生成一个不错的报告,按月提供一些内容的摘要。

我有 2 个问题,有没有办法让按日历顺序而不是 alpha 对月份进行排序?而且,我想做的是为每年添加一个总行,并为整个报告添加一个总行?

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
4

1 回答 1

2

要按月订购,请使用以下命令:

  ORDER BY DATEPART(Month,Created) ASC

DatePart()返回指定部分的整数,1 表示 1 月,2 表示 2 月等。


COALESCE() 和 ISNULL() 函数可以帮助您的 SQL。这与您的第一个选择相同:

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

或者您不能将“额外”总列放入金额列中。

于 2010-10-20T03:20:18.963 回答