Sql server 2008 r2 SQL列填充

Sql server 2008 r2 SQL列填充,sql-server-2008-r2,Sql Server 2008 R2,我想知道是否可以在一个表中创建另一列,其中包含我希望填充到此新列中的数据?新列为Flag2。这是表格: 我想做的是,在项目id为30的情况下,我希望项目id只显示30次,并在Flag2中填充不支持的QC?我该怎么做 我只能考虑做一个内部连接,但这不起作用 这就是我努力做到的: SELECT A.ITEMID, A.FLAG1, A.FLAG2 FROM #FLAGS as A INNER JOIN #FLAGS as B ON A.ITEMID = B.ITEMI

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

我想做的是,在项目id为30的情况下,我希望项目id只显示30次,并在Flag2中填充不支持的QC?我该怎么做

我只能考虑做一个内部连接,但这不起作用

这就是我努力做到的:

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

假设我理解您的意图,如果任何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作为标志3,rght3作为标志4等


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

假设我了解您的目的,如果任何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作为标志3,rght3作为标志4等


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

?!?!你到底想做什么??更新表格并填写Flag2列??或者只是选择一些?你的问题不太清楚……我不完全确定你想要完成什么。您正在尝试查询表或更新表中的值吗?如果您试图查询表,那么在查询您提供的示例数据时,您希望结果集是什么?Jeff,我很难弄清楚您正在做什么以及您想要完成什么。你能重新写清楚一点吗?当每个项目id有多个标志时,我想填充Flag2列。我不想有基于标志的重复id。因此,表中有30个,其中有2个,flag1中有2个不同的标志值。我希望将第二个标志名放在flag2中,并将其读取为itemid为30,flag1为onepage,flag2为qcsupported。我不知道我是否必须进行更新或创建视图才能真正做到这一点?@Jeff:你如何决定为itemid=30获取第二个项目??标准是什么??第二个按什么顺序排序???!?!你到底想做什么??更新表格并填写Flag2列??或者只是选择一些?你的问题不太清楚……我不完全确定你想要完成什么。您正在尝试查询表或更新表中的值吗?如果您试图查询表,那么在查询您提供的示例数据时,您希望结果集是什么?Jeff,我很难弄清楚您正在做什么以及您想要完成什么。你能重新写清楚一点吗?当每个项目id有多个标志时,我想填充Flag2列。我不想有基于标志的重复id。因此,表中有30个,其中有2个,flag1中有2个不同的标志值。我希望将第二个标志名放在flag2中,并将其读取为itemid为30,flag1为onepage,flag2为qcsupported。我不知道我是否必须进行更新或创建视图才能真正做到这一点?@Jeff:你如何决定为itemid=30获取第二个项目??标准是什么??第二个按什么顺序排序?我会尝试一下,然后告诉你。谢谢。我很高兴它能工作,但我想补充一点,因为您至少使用了SQLS2005,所以可以使用ROW_NUMBER而不是self join来生成I列。最好是这样,尤其是大桌子。内联选项卡的两个实例都可以简化为:SELECT l.ITEMID、l.FLAG1、ROW_NUMBER OVERPARTITION BY ITEMID ORDER BY FLAG1,因为我从测试l t开始,我将修改原始帖子以保持清晰。我将尝试一下,并让您知道。谢谢。我很高兴它能工作,但我想补充一点,因为您至少使用了SQLS2005,所以可以使用ROW_NUMBER而不是self join来生成I列。最好是这样,尤其是大桌子。内联ta的两个实例 be t可以减少为:选择l.ITEMID,l.FLAG1,行数按ITEMID超额分配,按FLAG1排序,因为我从测试l t i将修改原始帖子以保持清晰。