(不)复杂的sql查询!

时间:2010-12-30 02:47:38

标签: sql sql-server

LookupTable中:

userid, mobileid, startedate, enddate   , owner
1     , 1       , 12-12-2000, 01-01-2001, asd 
2     , 2       , 12-12-2000, 01-01-2001, dgs
3     , 3       , 02-01-2001, 01-01-2002, sdg
4     , 4       , 12-12-2000, 01-01-2001, sdg

UserInfoTable:

userid, firstname, lastname, address
1     , tom      , do      , test 
2     , sam      , smith   , asds
3     , john     , saw     , asdasda
4     , peter    , winston , near by

移动:

Mobileid, Name        , number, imeinumber
1       , apple       , 123   , 1111111
2       , nokia       , 456   , 2222222 
3       , vodafone    , 789   , 3333333

CallLogs:

id       , Mobileid, callednumbers (string), date         , totalduration
1        , 1       , 123,123,321           , 13-12-2000   , 30
2        , 1       , 123,123,321           , 14-12-2000   , 30
3        , 2       , 123,123,321           , 13-12-2000   , 30
4        , 2       , 123,123,321           , 14-12-2000   , 30
5        , 3       , 123,123,321           , 13-12-2000   , 30
6        , 3       , 123,123,321           , 14-12-2000   , 30
7        , 1       , 123,123,321           , 13-01-2002   , 30
8        , 1       , 123,123,321           , 14-01-2002   , 30

我想要一个查询,它将返回以下内容:

firstname,lastname,mobile.name作为mobilename,callednumbers(作为CallLogs表中不同行的连续字符串),需要2000年 例如:

firstname, lastname, mobilename, callednumbers
tom      , do      , apple     , 123,123,321, 123,123,321
sam      , smith   , nokia     , 123,123,321, 123,123,321
peter    , winston , apple     , 123,123,321, 123,123,321

任何帮助都将受到高度赞赏......

我已经尝试了这个但没有成功..汤姆正在接受调查,反之亦然。我正在使用sql server。

SELECT DISTINCT firstname,
                lastname,
                mobilename,
                callednumbers
FROM   ([testdatabase].[dbo].[LookupTable] lt
        INNER JOIN [testdatabase].[dbo].[UserInfoTable] user1
          ON lt.userid = user1.id)
       INNER JOIN [testdatabase].[dbo].[Mobile] device1
         ON lt.mobileid = device1.id
       INNER JOIN [testdatabase].[dbo].[CallLogs] log1
         ON lt.mobileid = log1.deviceid
WHERE  lt.starttime LIKE '%2000%'
ORDER  BY firstname  

1 个答案:

答案 0 :(得分:4)

DECLARE @LookupTable TABLE (
  userid     INT,
  mobileid   INT,
  startedate DATETIME,
  enddate    DATETIME,
  owner      CHAR(3))

INSERT INTO @LookupTable
SELECT 1, 1, '20001212 00:00:00.000', '20010101 00:00:00.000', N'asd' UNION ALL
SELECT 2, 2, '20001212 00:00:00.000', '20010101 00:00:00.000', N'dgs' UNION ALL
SELECT 3, 3, '20010102 00:00:00.000', '20020101 00:00:00.000', N'sdg' UNION ALL
SELECT 4, 4, '20001212 00:00:00.000', '20010101 00:00:00.000', N'sdg'


DECLARE @UserInfoTable TABLE (
  userid    INT,
  firstname VARCHAR(10),
  lastname  VARCHAR(10),
  address   VARCHAR(10))

INSERT INTO @UserInfoTable
SELECT 1, N'tom', N'do', N'test' UNION ALL
SELECT 2, N'sam', N'smith', N'asds' UNION ALL
SELECT 3, N'john', N'saw', N'asdasda' UNION ALL
SELECT 4, N'peter', N'winston', N'near by'

DECLARE @Mobile TABLE (
  mobileid   INT,
  name       VARCHAR(10),
  number     INT,
  imeinumber INT )

INSERT INTO @Mobile
SELECT 1, N'apple', 123, 1111111 UNION ALL
SELECT 2, N'nokia', 456, 2222222 UNION ALL
SELECT 3, N'vodafone', 789, 3333333

DECLARE @CallLogs TABLE (
  id            INT,
  mobileid      INT,
  callednumbers VARCHAR(50),
  [date]        DATETIME,
  totalduration INT )

INSERT INTO @CallLogs
SELECT 1, 1, N'123,123,321', '20001213 00:00:00.000', 30 UNION ALL
SELECT 2, 1, N'123,123,321', '20001214 00:00:00.000', 30 UNION ALL
SELECT 3, 2, N'123,123,321', '20001213 00:00:00.000', 30 UNION ALL
SELECT 4, 2, N'123,123,321', '20001214 00:00:00.000', 30 UNION ALL
SELECT 5, 3, N'123,123,321', '20001213 00:00:00.000', 30 UNION ALL
SELECT 6, 3, N'123,123,321', '20001214 00:00:00.000', 30 UNION ALL
SELECT 7, 1, N'123,123,321', '20020113 00:00:00.000', 30 UNION ALL
SELECT 8, 1, N'123,123,321', '20020114 00:00:00.000', 30

SELECT DISTINCT firstname,
                lastname,
                device1.name AS mobilename,
                stuff((select ',' + callednumbers 
                       from @CallLogs log1 
                       where lt.mobileid = log1.mobileid 
                       for xml path('')), 1, 1, '') AS callednumbers 
FROM   (@LookupTable lt
        INNER JOIN @UserInfoTable user1
          ON lt.userid = user1.userid)
       INNER JOIN @Mobile device1
         ON lt.mobileid = device1.mobileid
WHERE  lt.startedate > '20000101' AND  startedate < '20010101'
ORDER  BY firstname