2017-08-30 6 views
1

誰かがより良いタイトルを知っていれば、それを変更してください。シンプルで純粋なSqlクエリ(重複した結果を取り除く)

私の試みは最高にmediacoreであることを知っています。あなたがもっと良いことを知っていれば、分かち合いましょう。私はそれが明確でシンプルな維持しようとします:

私のデータベーステーブル:

ID |  Category |  Number |  NumberInCategory | 

    1    A    31    101 
    2    B    31    107 
    3    C    31    121 
    4    A    32    191 
    5    A    33    165 
    6    B    32    156 
    7    C    32    127 

私は出力として必要なもの:

Number |   A   |  B  |   C  

    31    101    107    121 
    32    191    156    127 
    33    165    NULL    NULL 

私の試み:

SELECT (SELECT DISTINCT(Number) FROM MYDB V WHERE F.ID = V.ID) AS Id, 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'A') AS CategoryA , 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'B') AS CategoryB, 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'C') AS CategoryC 
FROM MYDB F; 

マイ結果:

31|101|107|121 
31|101|107|121 
31|101|107|121 
32|191|156|127 
33|165|| 
32|191|156|127 
32|191|156|127 

私はちょうどこれが働く方法を見つけるように見える。

I誰もがここで助けたい終わりhttps://www.tutorialspoint.com/execute_sql_online.php

BEGIN TRANSACTION; 

/* Create a table called SAMPLE */ 
CREATE TABLE MYDB(Id integer PRIMARY KEY, Category text, Number integer, NumberInCategory integer); 

/* Create few records in this table */ 
INSERT INTO MYDB VALUES(1,'A',31,101); 
INSERT INTO MYDB VALUES(2,'B',31,107); 
INSERT INTO MYDB VALUES(3,'C',31,121); 
INSERT INTO MYDB VALUES(4,'A',32,191); 
INSERT INTO MYDB VALUES(5,'A',33,165); 
INSERT INTO MYDB VALUES(6,'B',32,156); 
INSERT INTO MYDB VALUES(7,'C',32,127); 
COMMIT; 

/* Display all the records from the table */ 
SELECT * FROM MYDB; 

SELECT (SELECT DISTINCT(Number) FROM MYDB V WHERE F.ID = V.ID) AS Id, 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'A') AS CategoryA , 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'B') AS CategoryB, 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'C') AS CategoryC 
FROM MYDB F; 

EDIT 単純GROUP BYのための完全なスクリプトが.____仕事をしていませんです。

SELECT (SELECT Number FROM MYDB V WHERE F.ID = V.ID) AS Id, 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'A') AS CategoryA , 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'B') AS CategoryB, 
     (SELECT NumberInCategory FROM MYDB V WHERE F.Number = V.Number AND Category = 'C') AS CategoryC 
FROM MYDB F 
GROUP BY NUMBER; 

結果:

31|101|107|121                                                           
32|191|156|127                                                           
33|165|| 

(@Gordon Linoffによる)に認められた回答からaproachが良いですが。

+3

次の質問に答えを試しますSagiから:https://stackoverflow.com/questions/45920094/sql-server-trying-to-de-normalize-my-table/45920185?noredirect=1# comment78800061_45920185 – Eli

+0

あなたは3つのカテゴリしか持たないのでしょうか? – Greenspark

+0

@Greensparkこの場合、私は有限の金額を持っています(それらの3つだけ) – cantdoanything33

答えて

3

あなたは条件付きの集約を使用することができます。

select number, 
     max(case when category = 'A' then numberincategory end) as a, 
     max(case when category = 'B' then numberincategory end) as b, 
     max(case when category = 'C' then numberincategory end) as c 
from t 
group by number; 
1

SQL Serverは、PIVOTと呼ばれる構文をサポートしています。

SELECT number, [A],[B],[C] 
FROM (select category, number, numberincategory from a) t 
PIVOT 
(
    SUM([numberincategory]) 
    FOR category IN ([A],[B],[C]) 
) AS pvt; 

基本的な形式は次のとおりです。

SELECT 
    List,of,columns,that,will,form,row,headers, 
    List,of,row,values,that,form,column,headers 
FROM (
    select query that pulls ONLY the data you need for 
    row headers, column headers, and the columns you want to summarise 
)tablealias 
PIVOT 
(
    SUM/AVG/MIN/MAX/etc(column to summarise) 
    FOR category IN (List,of,row,values,that,form,column,headers) 
) AS pvt; 
関連する問題