Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 Server:使用联接表将列拆分为多列_Sql_Sql Server - Fatal编程技术网

SQL Server:使用联接表将列拆分为多列

SQL Server:使用联接表将列拆分为多列,sql,sql-server,Sql,Sql Server,我有三张桌子A、B、C 表A sID sName 1 Apple 2 Banana 3 Cherry 表B PointID PointName sID 1 seed 1 2 seed 2 3 stem 1 4 stem 2 5 stem 3 6 root 2 7 leave 1 表C PointID Time

我有三张桌子A、B、C

表A

sID sName
1   Apple
2   Banana
3   Cherry
表B

PointID PointName sID
1       seed      1
2       seed      2
3       stem      1
4       stem      2
5       stem      3
6       root      2
7       leave     1
表C

PointID Time                  pointValue
1       2013-03-15 12:00:00   23.0
2       2013-03-15 12:00:00   24.0
5       2013-03-15 12:00:00   25.0
1       2013-03-15 13:00:00   26.0
2       2013-03-15 13:00:00   27.0
6       2013-03-15 13:00:00   28.0
2       2013-03-16 13:00:00   29.0
6       2013-03-16 13:00:00   30.0
7       2013-03-15 13:00:00   31.0
我需要输出如下,只需显示按时间过滤的所有结果:

Time                  sName    seed    stem   root
2013-03-15 12:00:00   Apple    23.0    NULL   NULL 
2013-03-15 12:00:00   Banana   24.0    NULL   NULL
2013-03-15 12:00:00   Cherry   NULL    25.0   NULL
2013-03-15 13:00:00   Apple    26.0    NULL   NULL   
2013-03-15 13:00:00   Banana   27.0    NULL   28.0
我已经提出了一个使用多个连接的解决方案,但是我的结果确实显示了seed、stem、root为NULL的时间和sName,因为不需要pointName leave

SELECT HEADER.TIME
    ,HEADER.sName
    ,SD.seed
    ,STM.stem
    ,RT.root
FROM (
    SELECT C.TIME
        ,A.sName
    FROM B
    INNER JOIN C ON B.PointID = C.PointID
    INNER JOIN A ON B.sID = A.sID
    ) HEADER
FULL JOIN (
    SELECT C.TIME
        ,A.sName
    FROM B
    INNER JOIN C ON B.PointID = C.PointID
    INNER JOIN A ON B.sID = A.sID
    WHERE B.PointName = "seed"
    ) SD ON HEADER.TIME = SD.TIME
    AND HEADER.sName = SD.sName
FULL JOIN (
    SELECT C.TIME
        ,A.sName
    FROM B
    INNER JOIN C ON B.PointID = C.PointID
    INNER JOIN A ON B.sID = A.sID
    WHERE B.PointName = "stem"
    ) STM ON HEADER.TIME = STM.TIME
    AND HEADER.sName = STM.sName
FULL JOIN (
    SELECT C.TIME
        ,A.sName
    FROM B
    INNER JOIN C ON B.PointID = C.PointID
    INNER JOIN A ON B.sID = A.sID
    WHERE B.PointName = "root"
    ) RT ON HEADER.TIME = RT.TIME
    AND HEADER.sName = RT.sName
WHERE (HEADER.TIME > '2013-03-15 11:00:00')
    AND (HEADER.TIME < '2013-03-16 20:00:00')
我试图在最外层的where子句中添加OR子句,以检查3列中是否有一列不为null。但却没有得到回报

WHERE (HEADER.Time > '2013-03-15 11:00:00') AND (HEADER.Time < '2013-03-16 20:00:00') 
AND (SD.seed <> NULL OR STM.stem <> NULL OR RT.root <> NULL)
这将是伟大的有空选择解决,或评论,如果有更好的解决方案?由于我不确定我当前的方法是否适用于具有更多多列的实现

,我相信您需要一个解决方案,因为需要将行数据投影到列中:

SELECT Date, sName, [seed], [stem], [root], [leave]
FROM
(
   SELECT DATE, [PointName], [sName], PointValue
   FROM C 
     LEFT JOIN B ON C.PointID = B.POINTID
     LEFT JOIN A ON B.[sID] = A.[sID]
) p
PIVOT
(
  SUM(PointValue)
  FOR [PointName] IN ( [seed], [stem], [root], [leave])
) y;

我会首先将一些完整连接更改为内部连接,但前提是我知道这两个表之间只有数据,因此连接条件将始终为true,并在匹配时返回数据。首先,这将提高查询的性能。这看起来不错!但我也需要按日期筛选,我不确定如何将where子句放置在轴中。将筛选器添加到内部SELECT-即SELECT DATE。。。从C**其中日期>=X,日期