MSSQL导出某些列为空的表

MSSQL导出某些列为空的表,sql,sql-server,tsql,Sql,Sql Server,Tsql,因此,我需要从sql生成一个csv,如下所示: Class Teacher email Student email 3Sci Mr A a@c.com James James@s.com Mary Mary@s.com Joseph Joe@s.com 4Eng Mr B b@c.com

因此,我需要从sql生成一个csv,如下所示:

Class   Teacher    email     Student    email
3Sci    Mr A       a@c.com   James      James@s.com
                             Mary       Mary@s.com
                             Joseph     Joe@s.com
4Eng    Mr B       b@c.com   William    William@s.com
                             James      James@s.com
                             Mary       Mary@s.com
等等。 我可以使用SQL获得以下信息:

3Sci    Mr A       a@c.com   James      James@s.com
3Sci    Mr A       a@c.com   Mary       Mary@s.com
3Sci    Mr A       a@c.com   Joseph     Joe@s.com
4Eng    Mr B       b@c.com   William    William@s.com
4Eng    Mr B       b@c.com   James      James@s.com
4Eng    Mr B       b@c.com   Mary       Mary@s.com

我的问题是,有人知道如何在不删除整行的情况下删除这些重复项吗?如果我能做到这一点,那么我将能够将其全部导出到csv。我知道它不能形成一个非常好的表结构,但这正是第三方对我的要求。

通常我建议在应用层这样做。但您可以使用窗口函数在SQL中指出这一点:

with t as (
      <your query here>
    )
select (case when seqnum = 1 then t.Class end) as class,
       (case when seqnum = 1 then t.Teacher end) as teacher,
       (case when seqnum = 1 then t.email end) as email,
       t.Student, t.email
from (select t.*,
             row_number() over (partition by t.Class, t.Teacher, t.email order by t.Student) as seqnum
      from t
     ) t
order by t.Class, t.Teacher, t.email, seqnum;
注意外部查询中的ORDERBY。这是非常重要的。SQL不保证结果集的顺序,除非您有order by。而且,排序对于解释结果文件非常重要


如果NULL值不输出为空,则使用else输出空字符串。

在SQL Server中,您可以使用带有行号的CTE来清除值。以下是一个例子:

; WITH cteMain AS
(
    SELECT '1' AS A, 'r' AS B, 't' AS C
    UNION
    SELECT '1' AS A, 'r' AS B, 'a' AS C
    UNION
    SELECT '2' AS A, 'y' AS B, 'a' AS C
    UNION
    SELECT '2' AS A, 'i' AS B, 'u' AS C
),
cteGrouped AS
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY A, B, C) AS RowNumber
    FROM cteMain
),
cteOptimised AS
(
    SELECT 
        CASE ( SELECT G2.A FROM cteGrouped G2 WHERE G1.RowNumber > 1 AND G2.RowNumber = (G1.RowNumber-1) ) WHEN G1.A THEN '' ELSE G1.A END AS A,
        CASE ( SELECT G2.B FROM cteGrouped G2 WHERE G1.RowNumber > 1 AND G2.RowNumber = (G1.RowNumber-1) ) WHEN G1.B THEN '' ELSE G1.B END AS B,
        CASE ( SELECT G2.C FROM cteGrouped G2 WHERE G1.RowNumber > 1 AND G2.RowNumber = (G1.RowNumber-1) ) WHEN G1.C THEN '' ELSE G1.C END AS C
    FROM cteGrouped G1
)
SELECT *
FROM cteOptimised

您当前是如何生成csv文件的?您使用的是哪种sql?sql server、mysql等提供了一个简洁的解决方案。非常感谢。这非常有效。