2014-10-30 47 views
1

我有一个问题给大家。我在工作中'继承'了一个数据库,并且必须使用不同的条件从表中创建报表。请注意我不是sql专家,我希望我写的是合理的。根据不同条件从两列中检索值

试图简化,我有一个包含以下内容的硬件表:

  • HWTYPE - 类型的硬件
  • HWMODEL - 硬件的模型
  • PHONENUM - 电话号码
  • USERID - 用户的硬件分配给

的数据是这样的:

HWTYPE | HWMODEL | PHONENUM | USERID 
-------+------------+------------+---------- 
SIM | SIMVOICE | 123456 | CIRO 

SIM | SIMVOICE | 124578 | LEO 

PHONE | APPLE  |   | CIRO 

PHONE | SAMSUNG |   | LEO 

现在你可以看到,每个用户分配了一个手机和一个SIM卡一个电话号码。

我需要为每个用户对数据进行排序,使查询结果的每一行的样子:

HW  | PHONENUM | USERID 
---------+--------------+------ 
APPLE | 123456  | CIRO 

SAMSUNG | 124578  | LEO 

所以基本上:基于用户组列PHONENUM和HWMODEL。

这就是我卡住的地方!我尝试了联合,加入,案件等,但我仍然没有得到正确的结果。 再次为(可能)非常基本的问题道歉。我试图寻找类似的东西,但找不到任何东西。

感谢谁愿意帮助我。 问候 利奥

+0

由于某些原因,我无法编辑我的文章,在开始处添加'hello SQL Experts'。 – 2014-10-30 09:28:25

+1

'SELECT(HWTYPE,HWMODEL,USERID)FROM HARDWARE GROUP BY(USERID)'应该这样做 – 2014-10-30 09:35:01

回答

0

你也可以得到你的预期使用以下查询的结果。这将在硬件表上使用自加入,并减少查询syntex的长度。

SELECT H2.HWMODEL AS HW,H1.PHONENUM,H1.USERID FROM HARDWARE H1 INNER JOIN HARDWARE H2 ON H1.USERID = H2.USERID 
    WHERE ISNULL(H1.PHONENUM,'') <> '' 
    AND ISNULL(H2.PHONENUM,'') = '' 
ORDER BY H2.HWMODEL ASC 

希望这会帮助你。

0

如果你的目标是通过用户进行排序的电话号码和型号的列表,你可以使用这个查询:

SELECT HWMODEL,PHONENUM,USERID FROM HARDWARE ORDER BY USER 

希望有了解你的问题

+0

感谢您的回复,但在这种情况下,我只获取用户排序的行:在我的表中,每个用户都显示为两行:一个带有电话号码,一个带有设备。我需要将它们分组在一行中,所以我一眼就看到用户具有什么电话和什么电话号码。谢谢! – 2014-10-30 09:49:31

1

我不知道我明白你的问题 但我想你只需要为你的O/P写下面的查询

SELECT 
    HWTYPE, HWMODEL, USERID 
FROM 
    HARDWARE 
GROUP BY USERID ,HWTYPE,HWMODEL 
ORDER BY HWTYPE 
+0

你好,谢谢,但如果我这样做SQL Server返回一个错误,因为HWMODEL和HWTYPE不包含在GROUP BY子句中,如果我添加它们,我只是不分组任何东西... – 2014-10-30 09:48:22

+0

@Leo ooooopps我忘了写组条款中的HWTYPE&HWMODEL – 2014-10-30 09:50:57

+0

对不起,但此查询不会返回预期的结果,因为您的结果中需要电话号码。 – 2014-10-30 11:20:45

1

将我的评论作为答案;

写为您的SQL:

SELECT 
(HWTYPE, HWMODEL, USERID) 
FROM 
HARDWARE 
GROUP BY (USERID) /*Other Clauses can be added here, but ensure you use commas to seperate them!*/ 

采取这一步骤一步:

SELECT ... -> what columns you want to see 
FROM ... -> what table you want it from (use joins if you need from multiple tables) 
GROUP BY... -> What you want to collect together 

还有:

WHERE... -> conditions for when to include/what not to include 
+0

感谢您的解释! – 2014-10-30 10:30:58

+0

没问题!不过,我会建议从[W3学校](http://www.w3schools.com/sql/) – 2014-10-30 10:41:23

0
SELECT 
    hw.HWMODEL as HW 
    ,phone.PHONENUM 
    ,user.USERID 
FROM 
    (
     SELECT DISTINCT 
      USERID 
     FROM 
      HARDWARE 
    ) as user 

    LEFT JOIN 
    (
     SELECT 
      USERID 
      ,PHONENUM 
     FROM 
      HARDWARE 
     WHERE 
      PHONENUM IS NOT NULL 
    ) as phone 
     ON phone.USERID = user.USERID 

    LEFT JOIN 
    (
     SELECT 
      USERID 
      ,HWMODEL 
     FROM 
      HARDWARE 
     WHERE 
      HWTYPE = 'PHONE' 
    ) AS hw 
     ON hw.USERID = user.USERID 
ORDER BY 
    user.USERID 
    ,hw.HWMODEL 
+0

这样的喜欢学习SQL。这绝对是辉煌的,完全脱离我的联盟。谢谢! – 2014-10-30 10:29:42

+0

我点击'接受为答案'箭头;它告诉我必须有15个重点才能投票,但箭头保持绿色。希望你把这个当成投票。谢谢! – 2014-10-30 10:30:17

+0

@iValueValue,你为什么要做多个左连接?在一张桌子上做这件事不仅是不好的做法,而且效率很低! – 2014-10-30 10:34:00

相关问题