2014-10-30 71 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

相關問題