SQL SERVER - Сводная таблица, разделение числа по значению строки - PullRequest
0 голосов
/ 30 апреля 2019

Я новичок в SQL, и я немного пытаюсь проанализировать некоторые данные.У меня есть таблица [01-Jan-UserDefined], которая представляет собой набор данных ветра с 20-миллиметровыми линиями.Я создал таблицу [WINDDIR], которая генерирует сводную таблицу с соответствующими статистическими данными, считая строки данных по скорости ветра и направлению ветра.

Код разделяется по столбцам (скорость ветра), но не может быть разделен по направлению ветра.

Есть советы, как решить эту проблему?Thx

UPDATE WINDDIR
SET [0WS1] = counter1,
[1WS2] = counter2,
[2WS3] = counter3,
FROM (SELECT COUNT(CASE WHEN [01-Jan-UserDefined].[WindRel m s ] <=1 then 1 else null end) AS counter1, 
             COUNT(CASE WHEN [01-Jan-UserDefined].[WindRel m s ] >1 AND [01-Jan-UserDefined].[WindRel m s ] <= 2 then 1 else null end) AS >counter2,
             COUNT(CASE WHEN [01-Jan-UserDefined].[WindRel m s ] >2 AND [01-Jan-UserDefined].[WindRel m s ] <= 3 then 1 else null end) AS counter3,                          
from [01-Jan-UserDefined]) h

Пример данных:

SET DATEFORMAT DMY

DECLARE @Table AS TABLE ([UTC]               DATETIME
,                        [WindDirRel deg]    INT
,                        [WindRel m s]       DECIMAL(18, 2)
,                        [WINDDIR SECTOR]    NVARCHAR(3)
,                        [WINDDIR SECTOR NO] INT);

INSERT INTO @Table
(   UTC
,   [WindDirRel deg]
,   [WindRel m s]
,   [WINDDIR SECTOR]
,   [WINDDIR SECTOR NO])
VALUES ('27/01/2018 08:09', 127, 3.96, 'ESE', 6)
,      ('27/01/2018 08:09', 125, 4.06, 'ESE', 6)
,      ('27/01/2018 08:09', 125, 4.06, 'ESE', 6)
,      ('13/01/2018 22:01', 13, 10.39, 'N  ', 1)
,      ('13/01/2018 22:01', 12, 10.13, 'N  ', 1)
,      ('13/01/2018 22:01', 12, 10.44, 'N  ', 1);

SELECT * FROM @table

Фактический вывод:

WINDDIR SECTOR        0WS1 1WS2 2WS3 3W4 4W5 5W6 6W7 7W8 8W9 9W10 10W
N                     0     0    0    1   2   0   0   0   0    0   3
NNE                   0     0    0    1   2   0   0   0   0    0   3      
NE                    0     0    0    1   2   0   0   0   0    0   3
ENE                   0     0    0    1   2   0   0   0   0    0   3
ESE                   0     0    0    1   2   0   0   0   0    0   3

Желаемый вывод:

WINDDIR SECTOR        0WS1 1WS2 2WS3 3W4 4W5 5W6 6W7 7W8 8W9 9W10 10W
N                     0     0    0    0   0   0   0   0   0    0   3
NNE                   0     0    0    0   0   0   0   0   0    0   0      
NE                    0     0    0    0   0   0   0   0   0    0   0
ENE                   0     0    0    0   0   0   0   0   0    0   0
ESE                   0     0    0    1   2   0   0   0   0    0   0

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019
DECLARE @Table AS TABLE (WINDIR NVARCHAR(3), [WindRel m s ] DECIMAL(18, 2));

DECLARE @WINDIR AS TABLE (WINDIR NVARCHAR(3), [0WS1] INT, [1WS2] INT, [2WS3] INT);

INSERT INTO @WINDIR (WINDIR, [0WS1], [1WS2], [2WS3])
VALUES (N'N', 0, 0, 0)
,      (N'NNE', 0, 0, 0);

INSERT INTO @Table (WINDIR, [WindRel m s ])
VALUES (N'N', 0.1)
,      (N'N', 1.5)
,      (N'N', 1.75)
,      (N'N', 2.5)
,      (N'NNE', 1.5)
,      (N'NNE', 2.5);

WITH cte AS
    (SELECT WINDIR
     ,      COUNT(CASE WHEN [WindRel m s ] <= 1 THEN 1 ELSE NULL END)                         AS [0WS1]
     ,      COUNT(CASE WHEN [WindRel m s ] > 1 AND  [WindRel m s ] <= 2 THEN 1 ELSE NULL END) AS [1WS2]
     ,      COUNT(CASE WHEN [WindRel m s ] > 2 THEN 1 ELSE NULL END)                          AS [2WS3]
       FROM @Table
      GROUP BY WINDIR)
UPDATE  W
   SET  [0WS1] = cte.[0WS1]
,       [1WS2] = cte.[1WS2]
,       [2WS3] = cte.[2WS3]
  FROM  @WINDIR W
  JOIN  cte ON W.WINDIR = cte.WINDIR;

SELECT  *
  FROM  @WINDIR;
0 голосов
/ 30 апреля 2019

Посмотрите на это. Также обратите внимание, как я добавил пример набора данных - это поможет другим в будущем.

DECLARE @Table AS TABLE (WINDIR NVARCHAR(3), [WindRel m s ] DECIMAL(18, 2));

INSERT INTO @Table (WINDIR, [WindRel m s ])
VALUES (N'N', 0.1)
,      (N'N', 1.5)
,      (N'N', 1.75)
,      (N'N', 2.5)
,      (N'NNE', 1.5)
,      (N'NNE', 2.5);

SELECT WINDIR,COUNT(CASE WHEN [WindRel m s ]<=1 THEN 1 ELSE NULL END) AS [<1]
,COUNT(CASE WHEN [WindRel m s ]>1 AND [WindRel m s ] <= 2 THEN 1 ELSE NULL END) AS [1-2]
,COUNT(CASE WHEN [WindRel m s ]>2 THEN 1 ELSE NULL END) AS [>2]
 FROM @Table GROUP BY WINDIR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...