Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 按月从多个表中获取记录_Database_Sql Server 2008_Monthcalendar - Fatal编程技术网

Database 按月从多个表中获取记录

Database 按月从多个表中获取记录,database,sql-server-2008,monthcalendar,Database,Sql Server 2008,Monthcalendar,我有这样的场景:我有许多表,每个表都有日期字段 Table: FA Id | Created_Date | ------------------------ 1 | 1/12/2012 | 2 | 2/15/2012 | 3 | 2/25/2012 | Table: TPA Id | Created_Date | ------------------------ 1 | 3/10/2012 | 2 | 4/25/2012 | 3 | 5/20/2012 |

我有这样的场景:我有许多表,每个表都有日期字段

Table: FA

Id  | Created_Date  |
------------------------
1   | 1/12/2012 |
2   | 2/15/2012 |
3   | 2/25/2012 |

Table: TPA

Id  | Created_Date  |
------------------------
1   | 3/10/2012 |
2   | 4/25/2012 |
3   | 5/20/2012 |
4   | 5/21/2012 |

Table: Gift

Id  | Created_Date  |
------------------------
1   | 6/10/2012 |
2   | 7/25/2012 |
3   | 8/10/2012 |
3   | 7/11/2012 |
我想要输出,就像我想要每个表中记录的总数一样,并使用创建的日期字段日期按月显示它

预期输出如下:


试试这个解决方案

SELECT  MonthName, 
        COALESCE(FA, 0) FA, 
        COALESCE(TPA, 0) TPA, 
        COALESCE(GIFT, 0) GIFT
FROM
        (
            SELECT  monthList.ordby,
                    monthList.MonthName,
                    org.TableName,
                    org.TotalCount
            FROM    
                    (
                        SELECT 1 ordby, 'January' MonthName UNION SELECT 2, 'February' UNION
                        SELECT 3, 'March' UNION SELECT 4, 'April' UNION
                        SELECT 5,'May' UNION SELECT 6,'June' UNION
                        SELECT 7,'July' UNION SELECT 8,'August' UNION 
                        SELECT 9,'September' UNION SELECT 10,'October' UNION
                        SELECT 11,'November' UNION SELECT 12,'December'
                    ) monthList
                    LEFT JOIN
                    (
                        SELECT  'FA' TableName, 
                                DATENAME(mm,Created_Date) MonthName, 
                                COUNT(*) TotalCount
                        FROM    FA
                        GROUP   BY DATENAME(mm,Created_Date)
                        UNION
                        SELECT  'TPA' TableName, 
                                DATENAME(mm,Created_Date) MonthName, 
                                COUNT(*) TotalCount
                        FROM    TPA
                        GROUP   BY DATENAME(mm,Created_Date)
                        UNION
                        SELECT  'Gift' TableName, 
                                DATENAME(mm,Created_Date) MonthName, 
                                COUNT(*) TotalCount
                        FROM    Gift
                        GROUP   BY DATENAME(mm,Created_Date)
                    ) org ON monthList.MonthName = org.MonthName
        ) data
        PIVOT
        (
            MAX(TotalCount)
            FOR TableName IN ([FA], [TPA],[GIFT])
        ) head
ORDER   BY ordby

试试这个解决方案

SELECT  MonthName, 
        COALESCE(FA, 0) FA, 
        COALESCE(TPA, 0) TPA, 
        COALESCE(GIFT, 0) GIFT
FROM
        (
            SELECT  monthList.ordby,
                    monthList.MonthName,
                    org.TableName,
                    org.TotalCount
            FROM    
                    (
                        SELECT 1 ordby, 'January' MonthName UNION SELECT 2, 'February' UNION
                        SELECT 3, 'March' UNION SELECT 4, 'April' UNION
                        SELECT 5,'May' UNION SELECT 6,'June' UNION
                        SELECT 7,'July' UNION SELECT 8,'August' UNION 
                        SELECT 9,'September' UNION SELECT 10,'October' UNION
                        SELECT 11,'November' UNION SELECT 12,'December'
                    ) monthList
                    LEFT JOIN
                    (
                        SELECT  'FA' TableName, 
                                DATENAME(mm,Created_Date) MonthName, 
                                COUNT(*) TotalCount
                        FROM    FA
                        GROUP   BY DATENAME(mm,Created_Date)
                        UNION
                        SELECT  'TPA' TableName, 
                                DATENAME(mm,Created_Date) MonthName, 
                                COUNT(*) TotalCount
                        FROM    TPA
                        GROUP   BY DATENAME(mm,Created_Date)
                        UNION
                        SELECT  'Gift' TableName, 
                                DATENAME(mm,Created_Date) MonthName, 
                                COUNT(*) TotalCount
                        FROM    Gift
                        GROUP   BY DATENAME(mm,Created_Date)
                    ) org ON monthList.MonthName = org.MonthName
        ) data
        PIVOT
        (
            MAX(TotalCount)
            FOR TableName IN ([FA], [TPA],[GIFT])
        ) head
ORDER   BY ordby

自从上次4小时以来,我一直试图找到解决方案

我认为我的答案与上面的答案相比,性能较低

create table #month
(
    id [int] IDENTITY(1,1) NOT NULL,
    [month] varchar(3)
)

DBCC CHECKIDENT(#month, RESEED, 1)

insert into #month
values
('Jan'),
('Feb'),
('Mar'),
('Apr'),
('May'),
('Jun'),
('Jul'),
('Aug'),
('Sep'),
('Oct'),
('Nov'),
('Dec')


declare @id int
set @id=1

declare @month varchar(3)

declare @sql nvarchar(max)
set @sql=''
declare @order varchar(3)


while (@id<13)
BEGIN
    set @month=(select [month] from #month where id=@id)
    set @order=CONVERT(varchar(3),@id)
    set @sql=@sql+'insert into #display
(
    [Month],
    [COUNT(FA)],
    [COUNT(TPA)],
    [COUNT(Gift)],
    [ORDER]
)
    select '''+ @month +''' AS [Month],
    (select 
    COUNT(CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)) 
    from FA 
    where CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)='''+ @month +''') [COUNT(FA)],
    (select 
    COUNT(CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)) 
    from TPA 
    where CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)='''+ @month +''') [COUNT(TPA)],
    (select 
    COUNT(CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)) 
    from Gift 
    where CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)='''+ @month +''') [COUNT(Gift)],
    '''+ @order + ''' [Order]
    '


    set @id=@id+1   --Incrementing the month
END
exec sp_executesql @sql
print @sql


select [MONTH],
        [COUNT(FA)],
        [COUNT(TPA)],
        [COUNT(Gift)]
from #display
order by convert(int,[ORDER])
创建表#月
(
id[int]标识(1,1)不为空,
[月份]瓦查尔(3)
)
DBCC CHECKIDENT(#月,重新设定种子,1)
插入#月份
价值观
(‘Jan’),
('Feb'),
(‘Mar’),
("Apr"),,
(‘五月’),
(‘Jun’),
(‘Jul’),
(‘八月’),
(‘Sep’),
(‘十月’),
(‘Nov’),
('Dec')
声明@id int
设置@id=1
声明@month varchar(3)
声明@sql nvarchar(最大值)
设置@sql=''
声明@order varchar(3)

当(@id我试图找到解决方案时,从上一次4小时开始

我认为我的答案与上面的答案相比,性能较低

create table #month
(
    id [int] IDENTITY(1,1) NOT NULL,
    [month] varchar(3)
)

DBCC CHECKIDENT(#month, RESEED, 1)

insert into #month
values
('Jan'),
('Feb'),
('Mar'),
('Apr'),
('May'),
('Jun'),
('Jul'),
('Aug'),
('Sep'),
('Oct'),
('Nov'),
('Dec')


declare @id int
set @id=1

declare @month varchar(3)

declare @sql nvarchar(max)
set @sql=''
declare @order varchar(3)


while (@id<13)
BEGIN
    set @month=(select [month] from #month where id=@id)
    set @order=CONVERT(varchar(3),@id)
    set @sql=@sql+'insert into #display
(
    [Month],
    [COUNT(FA)],
    [COUNT(TPA)],
    [COUNT(Gift)],
    [ORDER]
)
    select '''+ @month +''' AS [Month],
    (select 
    COUNT(CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)) 
    from FA 
    where CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)='''+ @month +''') [COUNT(FA)],
    (select 
    COUNT(CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)) 
    from TPA 
    where CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)='''+ @month +''') [COUNT(TPA)],
    (select 
    COUNT(CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)) 
    from Gift 
    where CONVERT(VARCHAR(3), DATENAME(MM,Created_Date), 100)='''+ @month +''') [COUNT(Gift)],
    '''+ @order + ''' [Order]
    '


    set @id=@id+1   --Incrementing the month
END
exec sp_executesql @sql
print @sql


select [MONTH],
        [COUNT(FA)],
        [COUNT(TPA)],
        [COUNT(Gift)]
from #display
order by convert(int,[ORDER])
创建表#月
(
id[int]标识(1,1)不为空,
[月份]瓦查尔(3)
)
DBCC CHECKIDENT(#月,重新设定种子,1)
插入#月份
价值观
(‘Jan’),
('Feb'),
(‘Mar’),
("Apr"),,
(‘五月’),
(‘Jun’),
(‘Jul’),
(‘八月’),
(‘Sep’),
(‘十月’),
(‘Nov’),
('Dec')
声明@id int
设置@id=1
声明@month varchar(3)
声明@sql nvarchar(最大值)
设置@sql=''
声明@order varchar(3)

虽然(@idPlease更改问题中的表名。为什么如此?请查看您的输出并检查表名。我只是给用户一些提示,让用户清楚该字段显示表的记录总数。所以我只是写了它。否则我只想显示表名!好的,请更改问题中的表名。为什么如此?请参阅。)您的输出和检查表名。我只是让用户清楚地知道字段显示表的记录总数。所以我才写了它。否则我只想显示表名!好的,我知道了!这个查询有效!但是如果我只想显示那些有记录的月份名,意味着..如果所有表都没有e然后是12月的记录。..Dec Month不应显示。@INFOhUb只需将连接类型从skinny的查询从
LEFT join
更改为
internal join
Ohk我知道了!这个查询很有效!但是如果我只想显示那些有记录的月份名称,意味着..如果所有表在12月没有记录,那么..De不应显示c月。@INFOhUb只需将连接类型从skinny的查询从
左连接更改为
内部连接