SQL中需要不寻常的输出格式

时间:2016-06-02 23:01:58

标签: sql sql-server

我有一个格式的sql表;

Name   Date         Value
ABC    1/21/2015    52
ABC    1/22/2015    12
ABC    1/23/2015    32
DEF    1/21/2015    78
DEF    1/22/2015    53
etc...

为了与遗留程序兼容,我需要格式化文本文件,如下所示:

ABC
1/21/2015,52
1/22/2015,12
1/23/2015,32
DEF
1/21/2015,78
1/22/2015,53

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:8)

一种选择是使用UNION为结果集创建标题行,然后进行排序,使其显示在每个Name组的顶部。您可以使用计算列来执行此操作,该列将这些生成的行标识为标题。

SELECT CASE WHEN t.Header = 1
       THEN t.Name
       ELSE CONCAT(t.Date, ',', t.Value)
       END
FROM
(
    SELECT DISTINCT Name, NULL AS Date, NULL AS Value, 1 AS Header
    FROM yourTable
    UNION ALL
    SELECT Name, Date, Value, 0 AS Header
    FROM yourTable
) t
ORDER BY t.Name, t.Header DESC, t.Date

答案 1 :(得分:3)

这是一个非常黑客,但结果是你需要的:

诀窍是,使用这种形式的中间XML:

<x>ABC</x>
<x>2015.01.21,52</x>
<x>2015.01.22,12</x>
<x>2015.01.23,32</x>
<x>DEF</x>
<x>2015.01.21,78</x>
<x>2015.01.22,53</x>

然后很容易阅读每个&#34;节点&#34;:

SET LANGUAGE ENGLISH;
DECLARE @tbl TABLE(Name VARCHAR(100),Date DATE,Value INT);
INSERT INTO @tbl VALUES
 ('ABC','1/21/2015',52)
,('ABC','1/22/2015',12)
,('ABC','1/23/2015',32)
,('DEF','1/21/2015',78)
,('DEF','1/22/2015',53);

WITH DistinctNames AS
(
    SELECT DISTINCT NAME
    FROM @tbl
)
SELECT One.Line.value('.','varchar(100)') AS OneLine
FROM
(
SELECT
(
SELECT Name AS [x]
        ,(
        SELECT CONVERT(VARCHAR(10),t.Date,102) + ',' + CAST(t.Value AS VARCHAR(100))
        FROM @tbl AS t
        WHERE t.Name=DistinctNames.Name
        FOR XML PATH('x'),TYPE
        )
FROM DistinctNames
FOR XML PATH(''),TYPE
)
) AS tbl(x)
CROSS APPLY x.nodes('/x') AS One(Line)

答案 2 :(得分:2)

为我解决这个问题的最简单方法是使用查询。

SELECT Name, Date, Value 
FROM Table
ORDER BY Name ASC, Date ASC

然后使用一个简短的PHP脚本,每次获取一个新的名称,回复它并转储所有行,直到找到一个新的名称。

<?php
// SQL
$name = "";
foreach ($response as &$line) {
    if ($name != $line['Name']) {
        $line['Name'] = $name;
        echo $name . "<br />";
    }
    echo $line['Date'] . "," . $line['Value'] . "<br/>";
}
?>

并将其保存为文本文件。

注意:您可以使用&#34;百万&#34;不同的语言。我刚用PHP编写,因为对我来说它是最容易访问的。我的想法对其他人来说也是一样的。