归心小贩的gravatar头像
归心小贩 2015-06-09 16:57:07

SQL如何根据部门或用户的可变查询参数来查询文件信息?

请问一下,文件表(file) ,部门表(department),用户表(user).
file表字段:id,userid(文件所有者),viewcount(查看次数,默认0),download(下载次数,默认0)等
user表字段:id,did,uname,code等
department表字段:id,dname等
现在需要查询文件的:未查看总数,未下载总数,部门名称,用户名称,用户编号(code)等信息,关键是条件不好带上.

第一种情况:不带查询条件,根据部门分组,查询上面的信息,此情况用户名称和用户编号是查询不出来的.

第二种情况:根据某部门中用户分组查询上面的信息,

第三种情况:根据单个用户查询上面的信息.

该怎么查询啊,请大神帮忙了!如有不明白的请下方留言...

所有回答列表(2)
遇见,的gravatar头像
遇见,  LV36 2015年6月10日

大致写了个  你看看符合么

1 先写出查询的基础数据 将按人和按部分分组数据先查询出来。

SELECT A.DNAME,
       B.UNAME,
       B.CODE,
       C.VIEWCOUNT,
       SUM(C.VIEWCOUNT) OVER(PARTITION BY A.ID) GROUP_VIEWCOUNT,
       C.DOWNLOAD,
       SUM(C.DOWNLOAD) OVER(PARTITION BY A.ID) GROUP_DOWNLOAD
  FROM TMP_DEPARTMENT A
  LEFT JOIN TMP_USER B
    ON A.ID = B.DID
  LEFT JOIN TMP_FILE C
    ON B.ID = C.USERID
 WHERE 1 = 1

查询结果如下:

SQL如何根据部门或用户的可变查询参数来查询文件信息?

2、 将以上数据作为基表查询。

如果你需要以部门分组来显示,那么SQL为:

SELECT DISTINCT T.DNAME, T.GROUP_VIEWCOUNT VIEWCOUNT, T.GROUP_DOWNLOAD DOWNLOAD FROM
(SELECT A.DNAME,
       B.UNAME,
       B.CODE,
       C.VIEWCOUNT,
       SUM(C.VIEWCOUNT) OVER(PARTITION BY A.ID) GROUP_VIEWCOUNT,
       C.DOWNLOAD,
       SUM(C.DOWNLOAD) OVER(PARTITION BY A.ID) GROUP_DOWNLOAD
  FROM TMP_DEPARTMENT A
  LEFT JOIN TMP_USER B
    ON A.ID = B.DID
  LEFT JOIN TMP_FILE C
    ON B.ID = C.USERID
 WHERE 1 = 1) T

查询结果如下:

SQL如何根据部门或用户的可变查询参数来查询文件信息?

反之, 如果你根据用户来分组的话, SQL为:

SELECT T.DNAME, T.UNAME, T.CODE, T.VIEWCOUNT, T.DOWNLOAD FROM
(SELECT A.DNAME,
       B.UNAME,
       B.CODE,
       C.VIEWCOUNT,
       SUM(C.VIEWCOUNT) OVER(PARTITION BY A.ID) GROUP_VIEWCOUNT,
       C.DOWNLOAD,
       SUM(C.DOWNLOAD) OVER(PARTITION BY A.ID) GROUP_DOWNLOAD
  FROM TMP_DEPARTMENT A
  LEFT JOIN TMP_USER B
    ON A.ID = B.DID
  LEFT JOIN TMP_FILE C
    ON B.ID = C.USERID
 WHERE 1 = 1) T

查询结果如下:

SQL如何根据部门或用户的可变查询参数来查询文件信息?

对了, 还有一种情况  具体查询某个人 或者 某个部门   在基表where 1=1 后面拼接你的查询条件即可。

你要在程序里只需要判断是根据部门分还是根据人员分组 

如果是根据部门 在基表前面加

SELECT DISTINCT T.DNAME, T.GROUP_VIEWCOUNT VIEWCOUNT, T.GROUP_DOWNLOAD DOWNLOAD FROM

如果是根据人员则加

SELECT T.DNAME, T.UNAME, T.CODE, T.VIEWCOUNT, T.DOWNLOAD FROM

 

海波的gravatar头像
海波  LV4 2015年6月12日

楼上写的看不懂。

楼主的意思是sql会写。

但是想实现一个查询方法,以上3种情况合适用的,是这样吗?

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友