当每个部件只需要一个时,返回多行

时间:2018-02-20 22:18:24

标签: sql-server

下午好,

下面的SQL为每个pr_codenum返回多行。期望的结果是每行一行。我尝试使用GROUP BY而不对结果进行任何更改。列P01,P02等是设施位置,如果它们不使用特定的pr_codenum,它们将具有真,假或空白。最终将有20列。非常感谢任何指导。 谢谢 GQ

    SELECT ROW_NUMBER() OVER(ORDER BY wa_name) AS RowID, wa_id
    INTO #LOC 
    FROM "SomeTable"
    WHERE IsUsingTable = 1

    SELECT DISTINCT pr_codenum, pr_descrip, 
        CASE WHEN RowID = 1 THEN HazMatFlag ELSE '' END AS P01,
        CASE WHEN RowID = 2 THEN HazMatFlag ELSE '' END AS P02,
        CASE WHEN RowID = 3 THEN HazMatFlag ELSE '' END AS P03,
        CASE WHEN RowID = 4 THEN HazMatFlag ELSE '' END AS P04,
        CASE WHEN RowID = 5 THEN HazMatFlag ELSE '' END AS P05,
        CASE WHEN RowID = 6 THEN HazMatFlag ELSE '' END AS P06,
        CASE WHEN RowID = 7 THEN HazMatFlag ELSE '' END AS P07,
        CASE WHEN RowID = 8 THEN HazMatFlag ELSE '' END AS P08,
        CASE WHEN RowID = 9 THEN HazMatFlag ELSE '' END AS P09,
        CASE WHEN RowID = 10 THEN HazMatFlag ELSE '' END AS P010,
        CASE WHEN RowID = 11 THEN HazMatFlag ELSE '' END AS P011,
        CASE WHEN RowID = 12 THEN HazMatFlag ELSE '' END AS P012,
        CASE WHEN RowID = 13 THEN HazMatFlag ELSE '' END AS P013,
        CASE WHEN RowID = 14 THEN HazMatFlag ELSE '' END AS P014
    FROM (
        SELECT RowID, pr_codenum, pr_descrip, CASE WHEN p3_hazflag = 1 THEN 
    'True' ELSE 'False' END AS HazMatFlag 
    FROM "SomeTable" 
    INNER JOIN "AnotherTable" ON p3_prid = pr_id
    INNER JOIN "DifferentTable" ON wa_id = p3_waid  
    LEFT JOIN #LOC l ON l.wa_id = p3_waid
    WHERE pr_id IN (
        SELECT DISTINCT p3_prid FROM "YetAnotherTable" 
        INNER JOIN "Table" ON pr_id = p3_prid AND pr_active = 1
        WHERE p3_hazflag = 0 AND p3_prid IN (
            SELECT DISTINCT p3_prid FROM "YetAnotherTable" 
            INNER JOIN "Table" ON pr_id = p3_prid AND pr_active = 1 
            WHERE p3_hazflag = 1))
    )g              
    GROUP BY pr_codenum, pr_descrip, RowID, HazMatFlag
    ORDER BY pr_codenum

    DROP TABLE #LOC

2 个答案:

答案 0 :(得分:0)

我怀疑你想要聚合:

SELECT pr_codenum, pr_descrip, 
       MAX(CASE WHEN RowID = 1 THEN HazMatFlag ELSE '' END) AS P01,
       MAX(CASE WHEN RowID = 2 THEN HazMatFlag ELSE '' END) AS P02,
      . . .
FROM . . .
GROUP BY pr_codenum, pr_descrip
ORDER BY pr_codenum

答案 1 :(得分:0)

问题是你将每个不同的行号分成它自己的列,因为每一行都有一个不同列的值,你的distinct会返回每一行。

我把你的P柱包裹成最大值。如果一行包含一个hazmatflag,则max应选择该行而不是''并且您的group by应该允许它聚合到pr_codenum,pr_descrip。当然,这假设您的hazmatflag值大于空字符串,并且您的描述值对于相同值的codenum是相同的。

SELECT  RowID = ROW_NUMBER() OVER (ORDER BY wa_name),
        wa_id
INTO    #LOC
  FROM  "SomeTable"
  WHERE IsUsingTable = 1
;

SELECT      pr_codenum,
            pr_descrip,
            P01 = MAX( CASE WHEN g.RowID = 1 THEN g.HazMatFlag ELSE '' END ),
            P02 = MAX( CASE WHEN g.RowID = 2 THEN g.HazMatFlag ELSE '' END ),
            P03 = MAX( CASE WHEN g.RowID = 3 THEN g.HazMatFlag ELSE '' END ),
            P04 = MAX( CASE WHEN g.RowID = 4 THEN g.HazMatFlag ELSE '' END ),
            P05 = MAX( CASE WHEN g.RowID = 5 THEN g.HazMatFlag ELSE '' END ),
            P06 = MAX( CASE WHEN g.RowID = 6 THEN g.HazMatFlag ELSE '' END ),
            P07 = MAX( CASE WHEN g.RowID = 7 THEN g.HazMatFlag ELSE '' END ),
            P08 = MAX( CASE WHEN g.RowID = 8 THEN g.HazMatFlag ELSE '' END ),
            P09 = MAX( CASE WHEN g.RowID = 9 THEN g.HazMatFlag ELSE '' END ),
            P010 = MAX( CASE WHEN g.RowID = 10 THEN g.HazMatFlag ELSE '' END ),
            P011 = MAX( CASE WHEN g.RowID = 11 THEN g.HazMatFlag ELSE '' END ),
            P012 = MAX( CASE WHEN g.RowID = 12 THEN g.HazMatFlag ELSE '' END ),
            P013 = MAX( CASE WHEN g.RowID = 13 THEN g.HazMatFlag ELSE '' END ),
            P014 = MAX( CASE WHEN g.RowID = 14 THEN g.HazMatFlag ELSE '' END )
  FROM
            ( SELECT        l.RowID,
                            pr_codenum,
                            pr_descrip,
                            HazMatFlag = CASE WHEN p3_hazflag = 1 THEN 'True' ELSE 'False' END
                FROM        "SomeTable"
                INNER JOIN  "AnotherTable"
                  ON p3_prid = pr_id
                INNER JOIN  "DifferentTable"
                  ON wa_id = p3_waid
                LEFT JOIN   #LOC AS l
                  ON l.wa_id = p3_waid
                WHERE       pr_id IN ( SELECT       DISTINCT
                                                    p3_prid
                                         FROM       "YetAnotherTable"
                                         INNER JOIN "Table"
                                           ON pr_id = p3_prid
                                              AND   pr_active = 1
                                         WHERE      p3_hazflag = 0
                                                    AND p3_prid IN ( SELECT         DISTINCT
                                                                                    p3_prid
                                                                       FROM         "YetAnotherTable"
                                                                       INNER JOIN   "Table"
                                                                         ON pr_id = p3_prid
                                                                            AND pr_active = 1
                                                                       WHERE        p3_hazflag = 1 ))) AS g
  GROUP BY  pr_codenum,
            pr_descrip
  ORDER BY  pr_codenum
;

DROP TABLE #LOC
;