2013-05-19 4 views
1

Например, если у меня есть в следующей таблице:SQL Server: Как создать горизонтальный стол

| sensorid |date| value | 
------------------------- 
| 65000 | 00 | 32 | 
| 65000 | 01 | 40 | 
| 65000 | 02 | 35 | 
| 65000 | 03 | 37 | 
| 65000 | 04 | 39 | 
| 65001 | 00 | 06 | 
| 65001 | 01 | 10 | 
| 65001 | 02 | 15 | 
| 65001 | 03 | 26 | 
| 65001 | 04 | 39 | 

Я хочу, чтобы преобразовать эту таблицу?

| SENSORID | 00 | 01 | 02 | 03 | 04 | 
------------------------------------ 
| 65000 | 32 | 40 | 35 | 37 | 39 | 
| 65001 | 6 | 10 | 15 | 26 | 39 | 

Есть ли специальный метод или мне нужно найти способ повторить итерацию?

Мне нужна помощь. Спасибо!

+0

MySQL? SQL Server? Oracle? –

+0

Я бы рекомендовал использовать язык (php, python или что-то еще), который может взаимодействовать с базой данных. Затем вы можете прочитать все идентификаторы из 'data' и систематически генерировать определение таблицы. – alexis

+0

Прошу прощения. Я программирую на SQL Server –

ответ

1

PIVOT делает именно то, что вам нужно:

SELECT sensorid, 
     [00], [01], [02], [03], [04] 
FROM MyTable 
PIVOT 
(
    MAX(value) 
    FOR date IN ([00], [01], [02], [03], [04]) 
) AS PivotTable; 

http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

+0

Спасибо за ваш ответ, но моя проблема: если существует много «сенсоритов», и я хочу перебирать «пока». Как я получу все сенсоиды? –

+0

То есть число столбцов динамическое? – tpolyak

2

Это можно сделать, но вы не получите динамический запрос легко.

В качестве комментариев к подсказкам вашего вопроса это может быть проще выполнить с помощью языка программирования, на котором вы фактически выполняете SQL.

Если вы заранее знаете все «категории» (дата столбец в вашем случае), вы можете создать SQL как это:

select 
    sensorid, 
    max(case when date = 0 then value else 0 end) as date0, 
    max(case when date = 1 then value else 1 end) as date1, 
    max(case when date = 2 then value else 2 end) as date2, 
    max(case when date = 3 then value else 3 end) as date3, 
    max(case when date = 4 then value else 4 end) as date4 
from 
    yourtable 
group by 
    sensorid 

Вот полный LINQPad скрипт, который вы можете экспериментировать с:

USE master 
GO 

IF EXISTS (SELECT * FROM sysdatabases WHERE name = 'SO16639641') 
    DROP DATABASE SO16639641 
GO 

CREATE DATABASE SO16639641 
GO 

USE SO16639641 
GO 

CREATE TABLE original 
(
    sensorid int, 
    date_  int, 
    value  int 
) 
GO 

INSERT INTO original 
VALUES 
    (65000, 00, 32), 
    (65000, 01, 40), 
    (65000, 02, 35), 
    (65000, 03, 37), 
    (65000, 04, 39), 
    (65001, 00, 06), 
    (65001, 01, 10), 
    (65001, 02, 15), 
    (65001, 03, 26), 
    (65001, 04, 39) 
GO 

SELECT 
    sensorid, 
    MAX(CASE WHEN date_ = 0 THEN value ELSE 0 END) AS date0, 
    MAX(CASE WHEN date_ = 1 THEN value ELSE 1 END) AS date1, 
    MAX(CASE WHEN date_ = 2 THEN value ELSE 2 END) AS date2, 
    MAX(CASE WHEN date_ = 3 THEN value ELSE 3 END) AS date3, 
    MAX(CASE WHEN date_ = 4 THEN value ELSE 4 END) AS date4 
FROM 
    original 
GROUP BY 
    sensorid 
GO 

Или скачать here.

Я также добавил динамическую версию, которая будет определять, какие столбцы даты добавить в соответствии с данными. Немного больше, но вы можете найти оба сценария по вышеуказанной ссылке.

0

похоже, что вы хотите получать показания с каждого датчика в день? вы могли бы сделать это довольно счастливо, изменив ваш оператор выбора, чтобы заказать вывод

выберите дату, sensorid, значение из [имя_таблицы] упорядочить по дате по возрастанию, сенсоризованный asc;

DATE SENSORID VALUE 
00 65000 32 
00 65001 06 
01 65000 40 
01 65001 10

, если он на самом деле должно быть горизонтально отформатирован я предлагаю смотреть на PIVOT на MSDN

Смежные вопросы