微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

T-SQL COALESCE GROUPING SETS成单列,没有NULL重复

如何解决T-SQL COALESCE GROUPING SETS成单列,没有NULL重复

|| 一个同义词库,其中的术语和类别相互链接并运行sql Server 2008。 基于此和此答案。这是一个示例:
CREATE TABLE #term (termid VARCHAR(8),en VARCHAR(32),enscope VARCHAR(32))
CREATE TABLE #link (linkid VARCHAR(10),termid VARCHAR(8),reltype VARCHAR(2),refid VARCHAR(8))
CREATE TABLE #categorylink (code VARCHAR(3),termid VARCHAR(8))

INSERT INTO #term VALUES (\'100\',\'ABC\',\'abc_scopenote\')
INSERT INTO #term VALUES (\'120\',\'DEF\',\'def_scopenote\')
INSERT INTO #term VALUES (\'150\',\'GHI\',NULL)

INSERT INTO #link VALUES (\'1\',\'100\',\'NT\',\'120\')
INSERT INTO #link VALUES (\'2\',\'150\')
INSERT INTO #link VALUES (\'3\',\'120\',\'BT\',\'100\')
INSERT INTO #link VALUES (\'4\',\'RT\',\'150\')
INSERT INTO #link VALUES (\'5\',\'150\',\'100\')
INSERT INTO #link VALUES (\'6\',\'120\')

INSERT INTO #categorylink VALUES (\'S01\',\'100\')
INSERT INTO #categorylink VALUES (\'S02\',\'100\')
INSERT INTO #categorylink VALUES (\'B04\',\'150\')

SELECT
       CASE
       WHEN #term.enscope IS NULL AND refterm.en IS NULL AND #categorylink.code IS NULL
       THEN #term.en
       ELSE NULL
       END,CHAR(9) + \'SN \' + #term.enscope,CHAR(9) + #link.reltype + CHAR(32) + refterm.en,CHAR(9) + \'CODE \' + #categorylink.code
    FROM #link
        INNER JOIN #term ON #term.termid = #link.termid
        INNER JOIN #term AS refterm ON refterm.termid = #link.refid
        LEFT JOIN #categorylink ON #term.termid = #categorylink.termid

    GROUP BY GROUPING SETS (#term.en,(#term.en,#term.enscope),#link.linkid,#link.reltype,refterm.en),#categorylink.code))
    ORDER BY #term.en,#categorylink.code,#term.enscope
GO

DROP TABLE #term
DROP TABLE #link
DROP TABLE #categorylink
GO
如果\'enscope \'中为NULL,则表示行重复。 如果没有\'categorylink \'值,那么我有重复的行。 请如何避免这种情况? 我想将它们全部合并到一个没有重复的列中。
; WITH CTEterm AS (
    SELECT
       ROW_NUMBER() OVER (PARTITION BY #term.en,refterm.en ORDER BY #term.en) AS rownumber,#term.en AS mainterm,CHAR(9) + \'SN \' + #term.enscope AS scopenote,CHAR(9) + #link.reltype + CHAR(32) + refterm.en AS subterms,CHAR(9) + \'CODE \' + #categorylink.code AS codes
    FROM #link
       INNER JOIN #term ON #term.termid = #link.termid
       INNER JOIN #term AS refterm ON refterm.termid = #link.refid
       LEFT JOIN #categorylink ON #term.termid = #categorylink.termid
)

SELECT COALESCE(
    CASE
    WHEN rownumber = 1
    THEN mainterm
    ELSE NULL
    END,scopenote,subterms,codes
)
FROM CTEterm
GROUP BY GROUPING SETS ((mainterm,rownumber),(mainterm,scopenote),subterms),codes))
ORDER BY mainterm,codes,scopenote

GO
基本上如何避免在CASE中使用\'ELSE NULL \'(例如\'else skip row \')? 这就是我用COALESCE得到的
ABC
NULL
    SN abc_scopenote
    NT DEF
    NT GHI
    CODE S01
    CODE S02
NULL
DEF
    SN def_scopenote
    BT ABC
    RT GHI
NULL
GHI
    BT ABC
    RT DEF
    CODE B04
这就是我所需要的
ABC
    SN abc_scopenote
    NT DEF
    NT GHI
    CODE S01
    CODE S02
DEF
    SN def_scopenote
    BT ABC
    RT GHI
GHI
    BT ABC
    RT DEF
    CODE B04
同样的问题在这里     

解决方法

        抱歉,如果结果不是您期望的那样,但是如果您只需要摆脱NULL,那么我看不到为什么您不能这样做:
;WITH CTEterm AS (
    SELECT
       ROW_NUMBER() OVER (PARTITION BY #term.en,refterm.en
                              ORDER BY #term.en) AS rownumber,#term.en AS mainterm,CHAR(9) + \'SN \' + #term.enscope AS scopenote,CHAR(9) + #link.reltype + CHAR(32) + refterm.en AS subterms,CHAR(9) + \'CODE \' + #categorylink.code AS codes
    FROM #link
       INNER JOIN #term ON #term.termid = #link.termid
       INNER JOIN #term AS refterm ON refterm.termid = #link.refid
       LEFT JOIN #categorylink ON #term.termid = #categorylink.termid
)
SELECT
  AggValue
FROM (
  SELECT
    mainterm,codes,subterms,scopenote,
    COALESCE(
      CASE WHEN rownumber = 1 THEN mainterm ELSE NULL END,codes
    ) AS AggValue
  FROM CTEterm
  GROUP BY GROUPING SETS ((mainterm,rownumber),(mainterm,scopenote),subterms),codes))
) s
WHERE AggValue IS NOT NULL
ORDER BY mainterm,scopenote
注意:此处删除
ELSE NULL
只是因为它什么都没有改变(没有
ELSE
时就暗含了
NULL
),而不是因为删除它会得到任何收益。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?