求SQL语句 两表的连接查询的竖排日期编程横排日期,并且能够查询其它列的结果

r19880613 2015-08-31 04:29:13
最终要显示的样子
目前查询到的样子
目前的语句:SELECT ImageLengthAverageTable.PerformStartDate, CameraTable.TwoCode, ImageLengthAverageTable.ImageLiFengAverage
FROM ImageLengthAverageTable LEFT OUTER JOIN CameraTable ON ImageLengthAverageTable.CameraGuid = CameraTable.guid
WHERE (ImageLengthAverageTable.PerformStartDate>='2015-08-01') AND (ImageLengthAverageTable.PerformStartDate<='2015-08-31')
表创建语句:
第一张表:
CREATE TABLE [dbo].[CameraTable](
[CameraID] [int] IDENTITY(1,1) NOT NULL,
[guid] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[TwoCode] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_CameraTable] PRIMARY KEY CLUSTERED
(
[CameraID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
第二张表:
CREATE TABLE [dbo].[ImageLengthAverageTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PerformStartDate] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[CameraGuid] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[ImageLiFengAverage] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[ImageData] [image] NULL,
CONSTRAINT [PK_ImageLengthAverageTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
补充下 第一张表的guid和第二章表的CameraGuid对应的。
...全文
204 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
r19880613 2015-09-02
引用 12 楼 yangb0803 的回复:
[quote=引用 11 楼 r19880613 的回复:] 有没有显示第一次出现值的办法?
可以先过滤出你需要的数据,如果只要第一条,可以用 row_number() 分组排序后取第一条。 (借下Tiger_Zhao 大大的代码,修改了下,你看看)


WITH t1 AS (
    SELECT 
	       ROW_NUMBER() OVER(partition by DATEPART(hour, performstartdate), 
	       cameraguid order by id) as nid,
		   cameraguid,
	       performstartdate,   
	       DATEPART(hour,performstartdate) [hour],           
           imagelifengaverage
      FROM imagelengthaveragetable
     WHERE (performstartdate >= '2015-08-01')
       AND (performstartdate < '2015-09-01')
),
t as
(
  SELECT t1.[hour], t2.twocode, t1.imagelifengaverage 
    FROM t1
    LEFT JOIN cameratable as t2
        ON t1.cameraguid = t2.[guid]
    WHERE t1.nid =1
)
SELECT twocode,
       [8] AS [8:00:00],
       [9] AS [9:00:00],
       [10] AS [10:00:00],
       [11] AS [11:00:00],
       [12] AS [12:00:00],
       [13] AS [13:00:00],
       [14] AS [14:00:00],
       [15] AS [15:00:00],
       [16] AS [16:00:00],
       [17] AS [17:00:00]
  FROM t
 PIVOT (MIN(imagelifengaverage)
        FOR [hour] IN ([8],[9],[10],[11],[12],[13],[14],[15],[16],[17])
       ) p

[/quote] 这个只是把一个月的数据集合在一起了,我要的是分开的看10楼,就算把条件改成 WHERE (performstartdate= '2015-08-01') WHERE (performstartdate = '2015-08-02') WHERE (performstartdate = '2015-08-03') WHERE (performstartdate >= '2015-08-04') WHERE (performstartdate >= '2015-08-05')....... WHERE (performstartdate >= '2015-09-01')要循环30多次才能查完一个月的,30次的数据库读取。。。会很慢 还有就是不是整点的时间的显示。。。。那个只是刚巧数据库里的数值是整点。。
回复
道玄希言 2015-09-02
引用 11 楼 r19880613 的回复:
有没有显示第一次出现值的办法?
可以先过滤出你需要的数据,如果只要第一条,可以用 row_number() 分组排序后取第一条。 (借下Tiger_Zhao 大大的代码,修改了下,你看看)


WITH t1 AS (
    SELECT 
	       ROW_NUMBER() OVER(partition by DATEPART(hour, performstartdate), 
	       cameraguid order by id) as nid,
		   cameraguid,
	       performstartdate,   
	       DATEPART(hour,performstartdate) [hour],           
           imagelifengaverage
      FROM imagelengthaveragetable
     WHERE (performstartdate >= '2015-08-01')
       AND (performstartdate < '2015-09-01')
),
t as
(
  SELECT t1.[hour], t2.twocode, t1.imagelifengaverage 
    FROM t1
    LEFT JOIN cameratable as t2
        ON t1.cameraguid = t2.[guid]
    WHERE t1.nid =1
)
SELECT twocode,
       [8] AS [8:00:00],
       [9] AS [9:00:00],
       [10] AS [10:00:00],
       [11] AS [11:00:00],
       [12] AS [12:00:00],
       [13] AS [13:00:00],
       [14] AS [14:00:00],
       [15] AS [15:00:00],
       [16] AS [16:00:00],
       [17] AS [17:00:00]
  FROM t
 PIVOT (MIN(imagelifengaverage)
        FOR [hour] IN ([8],[9],[10],[11],[12],[13],[14],[15],[16],[17])
       ) p

回复
r19880613 2015-09-02
引用 8 楼 yangb0803 的回复:
[quote=引用 6 楼 r19880613 的回复:] PerformStartDate 和TwoCode相同数据 显示的时候直接显示找到到一条数据里的imagelifengaverage也就是只显示3,5重复了就去掉或者忽略掉。
那你將 AVG 改成 MIN 或者MAX [/quote] 有没有显示第一次出现值的办法?
回复
r19880613 2015-09-02
引用 8 楼 yangb0803 的回复:
[quote=引用 6 楼 r19880613 的回复:]
PerformStartDate 和TwoCode相同数据 显示的时候直接显示找到到一条数据里的imagelifengaverage也就是只显示3,5重复了就去掉或者忽略掉。


那你將 AVG 改成 MIN 或者MAX [/quote]


年月日这些都是要的包括后面的时间点
主要是按天导出相应的数据即可。
所以SQL我必许查到这样结构的数据才有意义,软件查询端会出现跨天现象。一行显示不下怎么多我只能换行显示了。
TwoCode 2015-08-29 11:22:21 2015-08-2914:31:11 2015-08-2917:45:23 2015-08-29 20:11:55
024 0.47 0.14 0.55 0.33
060 1.09 0.77 0.99 1.11
001 1.3 1.04 1.34 1.24
043 7.67 0 9.11 0
006 25.75 0 12.03 2.98,
004 2.2 0 0 23.52
085 1.59 1.37 1.25 1.49

TwoCode 2015-08-30 11:15:00 2015-08-3014:22:00 2015-08-30 17:33:00 2015-08-30 20:44:00

002 0.18 0.13 0.16 0.54
005 2.09 0 0 22.26
042 9.08 10.05 10.12 0
044 0.86 2.89 2.95 0
回复
道玄希言 2015-09-01
引用 6 楼 r19880613 的回复:
PerformStartDate 和TwoCode相同数据 显示的时候直接显示找到到一条数据里的imagelifengaverage也就是只显示3,5重复了就去掉或者忽略掉。
那你將 AVG 改成 MIN 或者MAX
回复
道玄希言 2015-09-01
引用 4 楼 r19880613 的回复:
消息 8117,级别 16,状态 1,第 1 行 操作数数据类型 nvarchar 对于 avg 运算符无效。 imagelifengaverage这个字段是nvarchar类型 不能计算。。。。
你要显示什么样的 ImageLiFengAverage 数据? 求平均, 则需要將 ImageLiFengAverage 字段改成 decimal(18,10)类型,或者通过 cte 查询转换成 decimal(18,10)类型 如果你要最大,最小,可用nvarchar类型
回复
r19880613 2015-09-01
PerformStartDate 和TwoCode相同数据 显示的时候直接显示找到到一条数据里的imagelifengaverage也就是只显示3,5重复了就去掉或者忽略掉。
回复
Tiger_Zhao 2015-09-01
那么你怎么统计?
比如3、5两条是相同时间、相同编号。
回复
r19880613 2015-09-01
消息 8117,级别 16,状态 1,第 1 行 操作数数据类型 nvarchar 对于 avg 运算符无效。 imagelifengaverage这个字段是nvarchar类型 不能计算。。。。
回复
Tiger_Zhao 2015-09-01
那么把[0]..[23]全部写上。
回复
Tiger_Zhao 2015-09-01
改为MAX即可。
回复
r19880613 2015-08-31
SELECT twocode, [8] AS [8:00:00], [9] AS [9:00:00], ... [17] AS [17:00:00] FROM t PIVOT (AVG(imagelifengaverage) FOR [hour] IN ([8],[9],[10],[11],[12],[13],[14],[15],[16],[17]) ) p[/code][/quote] 这边有个误会 时间是不固定的 可能 8点31 9点22这种 只是把表里时间字段是什么就显示什么
回复
Tiger_Zhao 2015-08-31
WITH t AS (
SELECT DATEPART(hour,imagelengthaveragetable.performstartdate) [hour],
cameratable.twocode,
imagelengthaveragetable.imagelifengaverage
FROM imagelengthaveragetable
LEFT JOIN cameratable
ON imagelengthaveragetable.cameraguid = cameratable.guid
WHERE (imagelengthaveragetable.performstartdate >= '2015-08-01')
AND (imagelengthaveragetable.performstartdate < '2015-09-01')
)
SELECT twocode,
[8] AS [8:00:00],
[9] AS [9:00:00],
...
[17] AS [17:00:00]
FROM t
PIVOT (AVG(imagelifengaverage)
FOR [hour] IN ([8],[9],[10],[11],[12],[13],[14],[15],[16],[17])
) p
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-31 04:29
社区公告
暂无公告