Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL/Excel:制作每小时SQL条目的Excel表格_Sql_Sql Server_Excel - Fatal编程技术网

SQL/Excel:制作每小时SQL条目的Excel表格

SQL/Excel:制作每小时SQL条目的Excel表格,sql,sql-server,excel,Sql,Sql Server,Excel,我有一个关于将一些SQL查询移动到Excel的问题。所以我现在有一个这样的表(我从SQL得到): 我想做的是建立一个excel表格,以小时为单位显示每个人的名字出现的次数。所以在6点钟的专栏下,我希望杰夫旁边有一个3,其他人都是0。7岁时,我希望杰夫得1分,亚历克斯得1分。在9点和10点,我希望亚历克斯和莎拉分别得1分和1分 以下是我希望它看起来的样子: | 06 | 07 | 08 | 09 | 10 | 11 ---------------------------------- J

我有一个关于将一些SQL查询移动到Excel的问题。所以我现在有一个这样的表(我从SQL得到):

我想做的是建立一个excel表格,以小时为单位显示每个人的名字出现的次数。所以在6点钟的专栏下,我希望杰夫旁边有一个3,其他人都是0。7岁时,我希望杰夫得1分,亚历克斯得1分。在9点和10点,我希望亚历克斯和莎拉分别得1分和1分

以下是我希望它看起来的样子:

     | 06 | 07 | 08 | 09 | 10 | 11
----------------------------------
Jeff | 3  | 1  | 0  | 0  | 0  | 0
Alex | 0  | 1  | 0  | 1  | 0  | 0
Sara | 0  | 0  | 0  | 0  | 1  | 0

一个选项是使用以下内容提取时间元素:

=INT(MOD(A2,1)*24) 
抄袭下来以适应

这将获取日期/时间的时间元素,并将其转换为小时和轮数

然后旋转:

为了确保一组完整的时间(例如include
8
),您需要将丢失的时间添加到源数据中

如果需要,可以选择显示
0
s而不是空白


默认情况下,名称顺序按字母顺序排列,但可以“手动”进行调整。

一个选项是使用以下内容提取时间元素:

=INT(MOD(A2,1)*24) 
抄袭下来以适应

这将获取日期/时间的时间元素,并将其转换为小时和轮数

然后旋转:

为了确保一组完整的时间(例如include
8
),您需要将丢失的时间添加到源数据中

如果需要,可以选择显示
0
s而不是空白


默认情况下,名称的顺序是按字母顺序排列的,但可以“手动”进行调整。

下面是一种在SQL中获得该结果的快捷方法:

SELECT
    name,
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 0 THEN 1 END) AS [00],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 1 THEN 1 END) AS [01],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 2 THEN 1 END) AS [02],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 3 THEN 1 END) AS [03],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 4 THEN 1 END) AS [04],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 5 THEN 1 END) AS [05],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 6 THEN 1 END) AS [06],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 7 THEN 1 END) AS [07],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 8 THEN 1 END) AS [08],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 9 THEN 1 END) AS [09],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 10 THEN 1 END) AS [10],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 11 THEN 1 END) AS [11],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 12 THEN 1 END) AS [12],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 13 THEN 1 END) AS [13],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 14 THEN 1 END) AS [14],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 15 THEN 1 END) AS [15],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 16 THEN 1 END) AS [16],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 17 THEN 1 END) AS [17],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 18 THEN 1 END) AS [18],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 19 THEN 1 END) AS [19],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 20 THEN 1 END) AS [20],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 21 THEN 1 END) AS [21],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 22 THEN 1 END) AS [22],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 23 THEN 1 END) AS [23]
FROM
    mytable -- Replace with the name of your table
GROUP BY
    name
这将根据个人(
name
)在该小时内是否有记录,为每个小时创建一列


这里使用的是
PIVOT
语法:

WITH mycte AS (
   -- To make sure that hours with no individuals (`name`), we full join to all possible hours (0-23)
SELECT
    hr.hour_number,
    mt.name,
    mt.[Date]
FROM
    (
    VALUES
        (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),
        (10),(11),(12),(13),(14),(15),(16),(17),
        (18),(19),(20),(21),(22),(23)
    ) hr (hour_number)
FULL JOIN
    mytable mt
    ON  (hr.hour_number = DATEPART(HOUR,mt.datet))
GROUP BY
    hr.hour_number,
    mt.name,
    mt.[Date]
)

-- This is the actual pivot. Had we not done the work above, hours were the value was 0 for all `name`s would not appear
SELECT
    name,
    [0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],
    [13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]
FROM
    mycte
PIVOT
    (
    COUNT([Date]) FOR hour_number IN (
        [0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],
        [13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]
        )
    ) p
WHERE
    name IS NOT NULL -- This ensure only records associated to a name is returned

以下是在SQL中获取该结果的一种快速而肮脏的方法:

SELECT
    name,
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 0 THEN 1 END) AS [00],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 1 THEN 1 END) AS [01],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 2 THEN 1 END) AS [02],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 3 THEN 1 END) AS [03],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 4 THEN 1 END) AS [04],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 5 THEN 1 END) AS [05],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 6 THEN 1 END) AS [06],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 7 THEN 1 END) AS [07],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 8 THEN 1 END) AS [08],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 9 THEN 1 END) AS [09],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 10 THEN 1 END) AS [10],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 11 THEN 1 END) AS [11],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 12 THEN 1 END) AS [12],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 13 THEN 1 END) AS [13],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 14 THEN 1 END) AS [14],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 15 THEN 1 END) AS [15],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 16 THEN 1 END) AS [16],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 17 THEN 1 END) AS [17],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 18 THEN 1 END) AS [18],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 19 THEN 1 END) AS [19],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 20 THEN 1 END) AS [20],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 21 THEN 1 END) AS [21],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 22 THEN 1 END) AS [22],
    COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 23 THEN 1 END) AS [23]
FROM
    mytable -- Replace with the name of your table
GROUP BY
    name
这将根据个人(
name
)在该小时内是否有记录,为每个小时创建一列


这里使用的是
PIVOT
语法:

WITH mycte AS (
   -- To make sure that hours with no individuals (`name`), we full join to all possible hours (0-23)
SELECT
    hr.hour_number,
    mt.name,
    mt.[Date]
FROM
    (
    VALUES
        (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),
        (10),(11),(12),(13),(14),(15),(16),(17),
        (18),(19),(20),(21),(22),(23)
    ) hr (hour_number)
FULL JOIN
    mytable mt
    ON  (hr.hour_number = DATEPART(HOUR,mt.datet))
GROUP BY
    hr.hour_number,
    mt.name,
    mt.[Date]
)

-- This is the actual pivot. Had we not done the work above, hours were the value was 0 for all `name`s would not appear
SELECT
    name,
    [0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],
    [13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]
FROM
    mycte
PIVOT
    (
    COUNT([Date]) FOR hour_number IN (
        [0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],
        [13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]
        )
    ) p
WHERE
    name IS NOT NULL -- This ensure only records associated to a name is returned

您使用的是什么DBMS?我想到了PIVOT。@Nicarus Microsoft SQL server management studioSQL server-哪个版本(2008 R2、2012等?)。仅供参考,Server Management Studio(SSMS)只是一个IDE。这不像T-SQL那么令人兴奋,但您也可以使用Excel的数据透视表功能您使用的是什么DBMS?我想到了数据透视。@Nicarus Microsoft SQL Server Management studioSQL Server-哪个版本(2008 R2、2012等?)。仅供参考,Server Management Studio(SSMS)只是IDE。这不像T-SQL那么令人兴奋,但您也可以使用Excel的透视表功能,因为表达式来自另一个星球。书签!:汉克斯!我试过了,效果很好,我需要一些关于数据透视表的练习来让它起作用。但是谢谢你的回复!这个表达来自另一个星球。书签!:汉克斯!我试过了,效果很好,我需要一些关于数据透视表的练习来让它起作用。但是谢谢你的回复!太棒了。一切都是这样的,除了每小时的计数被夸大了。15:00的数字应该是2,例如151。但是零是正确的。有什么想法吗?但不管怎样,谢谢,这非常有帮助!没关系,我在桌子上发现了一堆重复的东西,我需要去掉它们。很好!谢谢太棒了。一切都是这样的,除了每小时的计数被夸大了。15:00的数字应该是2,例如151。但是零是正确的。有什么想法吗?但不管怎样,谢谢,这非常有帮助!没关系,我在桌子上发现了一堆重复的东西,我需要去掉它们。很好!谢谢