SQL列填充

时间:2011-03-11 21:41:08

标签: sql-server-2008-r2

我想知道是否可以在表中创建另一个列,该列包含我希望在此新列中填充的数据?新列是Flag2。这是表格:

enter image description here

我想要做的是,在item id为30的情况下,我希望ITEM ID只显示30次,并填充Flag2中的QC Unsupportted?我该怎么做呢?

我只能考虑进行内连接,但这不起作用。

这是我在尝试这样做时所做的:

SELECT 
    A.ITEMID, A.FLAG1, A.FLAG2 
FROM 
    #FLAGS as A
INNER JOIN 
    #FLAGS as B ON A.ITEMID = B.ITEMID
GROUP BY 
    a.ITEMID, a.FLAG1, A.FLAG2
ORDER BY 
    ITEMID

1 个答案:

答案 0 :(得分:1)

假设我理解你的目标,如果任何ITEMID 的当前FLAG1值是不同的,并且你最多只有两个相同ID的实例,我认为这应该做你想要的:

SELECT
    lft.ITEMID
  , lft.FLAG1
  , rght.FLAG1 FLAG2
FROM (
  SELECT
      t.ITEMID
    , t.FLAG1
  FROM (
    SELECT
        l.ITEMID
      , l.FLAG1
      , COUNT(l.ITEMID) i
    FROM #FLAGS l
      INNER JOIN #FLAGS r ON l.ITEMID = r.ITEMID
    WHERE r.FLAG1 <= l.FLAG1
    GROUP BY
        l.ITEMID
      , l.FLAG1) t
  WHERE t.i=1) lft
  LEFT OUTER JOIN (
  SELECT
      t.ITEMID
    , t.FLAG1
  FROM (
    SELECT
        l.ITEMID
      , l.FLAG1
      , COUNT(l.ITEMID) i
    FROM #FLAGS l
      INNER JOIN #FLAGS r ON l.ITEMID = r.ITEMID
    WHERE r.FLAG1 <= l.FLAG1
    GROUP BY
        l.ITEMID
      , l.FLAG1) t
WHERE t.i=2) rght ON lft.ITEMID = rght.ITEMID

-- Or better
SELECT
    lft.ITEMID
  , lft.FLAG1
  , rght.FLAG1 FLAG2
FROM (
  SELECT
      t.ITEMID
    , t.FLAG1
  FROM (
    SELECT
        l.ITEMID
      , l.FLAG1
      , ROW_NUMBER() OVER(PARTITION BY ITEMID ORDER BY FLAG1) as i
    FROM test l) t
  WHERE t.i=1) lft
  LEFT OUTER JOIN (
  SELECT
      t.ITEMID
    , t.FLAG1
  FROM (
    SELECT
        l.ITEMID
      , l.FLAG1
      , ROW_NUMBER() OVER(PARTITION BY ITEMID ORDER BY FLAG1) as i
    FROM test l) t
  WHERE t.i=2) rght ON lft.ITEMID = rght.ITEMID

如果您有相同ID的其他标志值,则可以将新的外部联接添加到新的内联表(rght2,rght3等),其中i = 3,4等,并且您正在选择rght2 AS FLAG3 ,rght3 AS FLAG4等

另请注意,FLAG1的当前值将按字母顺序通过FLAG1和FLAG2分配。如果您想以相反的顺序分发它们,可以替换&lt; = with&gt; =。如果您希望按特定顺序分发两个以上的标志,则必须创建一个具有排名值的单独表格,并加入到可行但可能更加丑陋的表格中。