2017-01-11 11 views
1

商品にバーコードが含まれている商品のコレクションがあります。だから、バーコードを持たない製品をすべて表示したいのですが、バーコードがある製品にはバーコードでグループ化されているので、1つしか表示できません。与えられたデータ以上を1として、私のクエリは唯一の3製品は、SQLクエリになりますどのような1または2、3、4
、すなわち与えるべきバーコードが付いている商品とバーコードのない商品がある場合、商品別バーコードのSqlクエリ

ID Name  Barcode 
1 ABC   349377934434 
2 DEF   349377934434 
3 XYZ   NULL 
4 XXX   NULL 

:と仮定

は、私は以下のように表内の製品を持っています上記の条件のために?私は単一のクエリでデータをフェッチしたい私は上記の条件のための製品を見つけるために自分のコードでループを使いたくない。

この投稿は役に立ちましたか?事前のおかげで、あなたのリストでSQL Serverを含むよう

答えて

1
;WITH cte 
AS 
(
    SELECT ID, Name, Barcode 
    FROM (
     VALUES 
     (1, 'ABC', '349377934434'), 
     (2, 'DEF', '349377934434'), 
     (3, 'XYZ', NULL), 
     (4, 'XXX', NULL), 
     (5, 'ABC1', '34937'), 
     (6, 'DEF1', '34937'), 
     (7, 'DEF2', '34937') 
    )v(ID, Name, Barcode) 
) 

SELECT DISTINCT v.ID, v.Name, c.Barcode 
FROM cte c 
    CROSS APPLY (SELECT TOP 1 ID, Name FROM cte WHERE Barcode = c.Barcode) v 
WHERE c.Barcode IS NOT NULL 
UNION 
SELECT ID, Name, Barcode 
FROM cte c 
WHERE c.Barcode IS NULL 

(私は、MySQLで一時テーブルを使用する方法がわからないので、私は単純なテーブル "TEMP" をドロップ/作成):

CREATE TABLE temp(id INT, name VARCHAR(20), barcode VARCHAR(20)); 
    INSERT INTO temp SELECT 1, 'ABC', '349377934434'; 
    INSERT INTO temp SELECT 2, 'DEF', '349377934434'; 
    INSERT INTO temp SELECT 3, 'XYZ', NULL; 
    INSERT INTO temp SELECT 4, 'XXX', NULL; 
    INSERT INTO temp SELECT 5, 'ABC1', '34937'; 
    INSERT INTO temp SELECT 6, 'DEF1', '34937'; 
    INSERT INTO temp SELECT 7, 'XYZ2', '34937'; 

    SELECT DISTINCT v.ID, v.Name, c.Barcode 
    FROM temp c 
     INNER JOIN temp v ON v.ID = (SELECT ID FROM temp WHERE Barcode = c.Barcode LIMIT 1) 
    WHERE c.Barcode IS NOT NULL 
    UNION 
    SELECT ID, Name, Barcode 
    FROM temp 
    WHERE Barcode IS NULL; 

    DROP TABLE temp; 
+0

ご返信ありがとうございます。どうすればMysqlでこれを達成できますか? – Dhirender

+0

私は私の答えを編集しました –

+0

ありがとうございました。これは私が探していたものです。 – Dhirender

0

見ては、ここではそこで実行されますサンプルです:

DECLARE @table TABLE (id INT, name VARCHAR(20), barcode VARCHAR(20)); 
INSERT INTO @table SELECT 1, 'ABC', '349377934434'; 
INSERT INTO @table SELECT 2, 'DEF', '349377934434'; 
INSERT INTO @table SELECT 3, 'XYZ', NULL; 
INSERT INTO @table SELECT 4, 'XXX', NULL; 
WITH Summary AS (
    SELECT 
     ISNULL(barcode, CONVERT(VARCHAR(50), NEWID())) AS barcode, 
     MAX(name) AS name 
    FROM 
     @table 
    GROUP BY 
     ISNULL(barcode, CONVERT(VARCHAR(50), NEWID()))) 
SELECT 
    CASE WHEN barcode LIKE '%-%' THEN NULL ELSE barcode END AS barcode, 
    name 
FROM 
    Summary; 

それは名前でトップの結果を取って、バーコードによってかなり自己説明、Iグループです重複がある場所。バーコードがNULLの場合は、ランダムなGUIDに置き換えます。最後に、これらを取り除きます。

結果は以下のとおりです。

barcode   name 
349377934434 DEF 
NULL   XXX 
NULL   XYZ 
MySQLの
+0

感謝。どうすればMysqlでこれを達成できますか? – Dhirender

0

どのようCTEとUNIONを使用する方法について:

セットアップ

CREATE TABLE #Products 
(ID int, 
    Name VARCHAR(5), 
    BarCode VARCHAR(15) NULL 
) 

INSERT INTO #Products 
VALUES (1, 'ABC', '349377934434'), 
     (2, 'DEF', '349377934434'), 
     (3, 'XYZ', NULL), 
     (4, 'XXX', NULL) 

問い合わせ:ご返信用

;WITH CTE 
As 
(
    SELECT ID, Name, BarCode, ROW_NUMBER() OVER (Partition By BarCode ORDER BY ID) AS RN 
    FROM #Products 
    WHERE BarCode is NOT Null 
) 
SELECT ID, Name, BarCode 
FROM #Products 
WHERE BarCode is Null 
UNION 
SELECT ID, Name, BarCode 
FROM CTE 
WHERE RN = 1 

DROP TABLE #Products 
関連する問題