TQSL to reformat records with duplicate data into one record

时间:2017-08-30 20:42:06

标签: sql sql-server

we have a table that is being provided to us where there are lots of duplicated data in then rows and the only difference is opening and closing times for a certain day of the week - data is provided in this way and the client will not chnage things from their end.

import tensorflow as tf
slim = tf.contrib.slim  
images = tf.placeholder(tf.float32, shape=(None, None, None, 1))
NUM_CLASSES = 18
scope = 'CifarNet'

with tf.variable_scope(scope, 'CifarNet', [images, NUM_CLASSES]):
  net = slim.conv2d(images, 64, [5, 5], scope='conv1')
  net = slim.max_pool2d(net, [2, 2], 2, scope='pool1')
  net = tf.nn.lrn(net, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, name='norm1')
  net = slim.conv2d(net, 64, [5, 5], scope='conv2')
  net = tf.nn.lrn(net, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, name='norm2')
  net = slim.max_pool2d(net, [2, 2], 2, scope='pool2')
  net = slim.flatten(net)
  net = slim.fully_connected(net, 384, scope='fc3')

How could the information be stored/presented in the following way using TSQL so that I can retrieve the data from a table or preferably a view - so I don't have to run the data through e.g. a PHP program to do the formating for me? I deally of the data can be in a format that we can read straight from a table/view that would be ideal/

Dense

I know exactly how many columns I will need fro opening closing time i.e. 5 columns for each day of the week so creating the table to store the information is not an issue and does not change

Kind regards Taki

3 个答案:

答案 0 :(得分:0)

此查询效率不高,我不建议直接从SQL查询中使用此格式,但应该可以执行以下操作,假设您的数据继续遵循上面发布的相同格式。

SELECT DISTINCT
    Col1,
    Col2,
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Mon'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Mon'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Mon'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Mon'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Mon'),
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Tue'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Tue'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Tue'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Tue'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Tue'),
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Wed'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Wed'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Wed'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Wed'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Wed'),
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Thur'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Thur'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Thur'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Thur'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Thur'),
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Fri'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Fri'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Fri'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Fri'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Fri'),
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sat'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sat'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sat'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sat'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sat'),
    (SELECT TOP 1 Col3 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sun'),
    (SELECT TOP 1 Col4 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sun'),
    (SELECT TOP 1 Col5 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sun'),
    (SELECT TOP 1 Col6 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sun'),
    (SELECT TOP 1 Col7 FROM ShopTable st_inner WHERE st_inner.Col1 = st.Col1 AND st_inner.Col3 = 'Sun')

答案 1 :(得分:0)

我没有办法测试这个查询,但基本上你需要这样的东西:

SELECT mon.col2, MonStart, MonEnd, TueStart, ... 
FROM 
(
    SELECT distinct Col2,
    CASE col3 WHEN 'Mon' THEN Col5 ELSE NULL END as MonStart,
    CASE col3 WHEN 'Mon' THEN Col7 ELSE NULL END as MonEnd,
    FROM table
) mon
INNER JOIN 
(
    SELECT distinct Col2,
    CASE col3 WHEN 'Tue' THEN Col5 ELSE NULL END as TueStart,
    CASE col3 WHEN 'Tue' THEN Col7 ELSE NULL END as TueEnd,
    FROM table
) tue on mon.col2 = tue.col2
INNR JOIN 
...

如评论中所述,您不需要额外的列来打开/关闭状态,只需为您的列添加正确的名称。

答案 2 :(得分:0)

这应该是你正在寻找的......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData;

CREATE TABLE #TestData (
    Col2 CHAR(5) NOT NULL,
    Col3 CHAR(3) NOT NULL,
    Col4 CHAR(4) NOT NULL,
    Col5 TIME(0) NOT NULL,
    Col6 CHAR(5) NOT NULL,
    Col7 TIME(0) NOT NULL 
    );

INSERT #TestData (Col2, Col3, Col4, Col5, Col6, Col7) VALUES 
    ('Shop1', 'Mon', 'open', '6am ', 'Close', '4pm'),
    ('Shop1', 'Tue', 'Open', '6am ', 'Close', '5pm'),
    ('shop1', 'Wed', 'Open', '6am ', 'Close', '4pm'),
    ('Shop2', 'Mon', 'open', '10am', 'Close', '3pm'),
    ('Shop2', 'Tue', 'open', '11am', 'Close', '2pm');


-- SELECT * FROM #TestData td;'
--============================================================

SELECT 
    Col1 = ROW_NUMBER() OVER (ORDER BY td.Col2),
    td.Col2,
    Col3 = MAX(CASE WHEN dn.DayNum = 1 THEN td.Col3 END),
    Col4 = MAX(CASE WHEN dn.DayNum = 1 THEN 'open' END),
    Col5 = MAX(CASE WHEN dn.DayNum = 1 THEN col5 END),
    Col6 = MAX(CASE WHEN dn.DayNum = 1 THEN 'close' END),
    Col7 = MAX(CASE WHEN dn.DayNum = 1 THEN col7 END),

    Col8 = MAX(CASE WHEN dn.DayNum = 2 THEN td.Col3 END),
    Col9 = MAX(CASE WHEN dn.DayNum = 2 THEN 'open' END),
    Col10 = MAX(CASE WHEN dn.DayNum = 2 THEN col5 END),
    Col11 = MAX(CASE WHEN dn.DayNum = 2 THEN 'close' END),
    Col12 = MAX(CASE WHEN dn.DayNum = 2 THEN col7 END),

    Col13 = MAX(CASE WHEN dn.DayNum = 3 THEN td.Col3 END),
    Col14 = MAX(CASE WHEN dn.DayNum = 3 THEN 'open' END),
    Col15 = MAX(CASE WHEN dn.DayNum = 3 THEN col5 END),
    Col16 = MAX(CASE WHEN dn.DayNum = 3 THEN 'close' END),
    Col17 = MAX(CASE WHEN dn.DayNum = 3 THEN col7 END),

    Col18 = MAX(CASE WHEN dn.DayNum = 4 THEN td.Col3 END),
    Col19 = MAX(CASE WHEN dn.DayNum = 4 THEN 'open' END),
    Col20 = MAX(CASE WHEN dn.DayNum = 4 THEN col5 END),
    Col21 = MAX(CASE WHEN dn.DayNum = 4 THEN 'close' END),
    Col22 = MAX(CASE WHEN dn.DayNum = 4 THEN col7 END),

    Col23 = MAX(CASE WHEN dn.DayNum = 5 THEN td.Col3 END),
    Col24 = MAX(CASE WHEN dn.DayNum = 5 THEN 'open' END),
    Col25 = MAX(CASE WHEN dn.DayNum = 5 THEN col5 END),
    Col26 = MAX(CASE WHEN dn.DayNum = 5 THEN 'close' END),
    Col27 = MAX(CASE WHEN dn.DayNum = 5 THEN col7 END)
FROM 
    #TestData td
    CROSS APPLY ( VALUES (CASE td.Col3
                                WHEN 'Mon' THEN 1
                                WHEN 'Tue' THEN 2
                                WHEN 'Wed' THEN 3
                                WHEN 'Thu' THEN 4
                                WHEN 'Fri' THEN 5
                            END) ) dn (DayNum)
GROUP BY
    td.Col2;

结果...

Col1                 Col2  Col3 Col4 Col5             Col6  Col7             Col8 Col9 Col10            Col11 Col12            Col13 Col14 Col15            Col16 Col17            Col18 Col19 Col20            Col21 Col22            Col23 Col24 Col25            Col26 Col27
-------------------- ----- ---- ---- ---------------- ----- ---------------- ---- ---- ---------------- ----- ---------------- ----- ----- ---------------- ----- ---------------- ----- ----- ---------------- ----- ---------------- ----- ----- ---------------- ----- ----------------
1                    Shop1 Mon  open 06:00:00         close 16:00:00         Tue  open 06:00:00         close 17:00:00         Wed   open  06:00:00         close 16:00:00         NULL  NULL  NULL             NULL  NULL             NULL  NULL  NULL             NULL  NULL
2                    Shop2 Mon  open 10:00:00         close 15:00:00         Tue  open 11:00:00         close 14:00:00         NULL  NULL  NULL             NULL  NULL             NULL  NULL  NULL             NULL  NULL             NULL  NULL  NULL             NULL  NULL