如何将数据库列拆分为单独的可查询值?

时间:2016-02-24 21:42:03

标签: sql-server

我不知道如何进行此查询。我需要获取大量信息,但这一切都在一列中。如果桌子向右旋转90度,它就可以了......大声笑......

ObjectInternalID列表示一个事件 的条件
我想要所有事件详情(值列)
仅适用于一个人where values = "his name"
在特定日期范围where values > "date range"

知道最简单的方法是什么?

enter image description here

进度更新

我试图创建一个临时表,但是当我添加into语句时,我遇到了问题。

select 
    s.ObjectInternalID
    , MAX(Case when UserDefinedFieldInternalID = 3 then Value end) as date1
    , MAX(Case when UserDefinedFieldInternalID = 4 then Value end) as resident1
    , MAX(Case when UserDefinedFieldInternalID = 66 then Value end) as attending1
    , MAX(Case when UserDefinedFieldInternalID = 14 then Value end) as date2
into 
    #TempQueryTable(
     MAX(Case when UserDefinedFieldInternalID = 3 then Value end) as date1
    , MAX(Case when UserDefinedFieldInternalID = 4 then Value end) as resident1
    , MAX(Case when UserDefinedFieldInternalID = 66 then Value end) as attending1
    , MAX(Case when UserDefinedFieldInternalID = 14 then Value end) as date2
from 
    DocUserDefinedData s
group by 
    s.ObjectInternalID

如果我对“输入”部分进行注释,它会运行,但否则我会得到一个"不正确的语法','错误。我没有看到

2 个答案:

答案 0 :(得分:3)

使用交叉表(也称为条件聚合)非常简单。它会是这样的。

select s.ObjectInternalID
    , MAX(Case when UserDefinedFieldInternalID = 3 then Value end) as YourDateColumn
    , MAX(Case when UserDefinedFieldInternalID = 4 then Value end) as YourFirstSmudgedColumn
    , MAX(Case when UserDefinedFieldInternalID = 2 then Value end) as YourColumnThatMightBeAName
    , MAX(Case when UserDefinedFieldInternalID = 66 then Value end) as YourSecondSmudgedColumn
    , MAX(Case when UserDefinedFieldInternalID = 14 then Value end) as YourSecondDateColumn
from SomeTable s
group by s.ObjectInternalID

如果您需要为此添加一些过滤,您可以轻松将其转换为派生表。

select *
from
(
    select s.ObjectInternalID
        , MAX(Case when UserDefinedFieldInternalID = 3 then Value end) as YourDateColumn
        , MAX(Case when UserDefinedFieldInternalID = 4 then Value end) as YourFirstSmudgedColumn
        , MAX(Case when UserDefinedFieldInternalID = 2 then Value end) as YourColumnThatMightBeAName
        , MAX(Case when UserDefinedFieldInternalID = 66 then Value end) as YourSecondSmudgedColumn
        , MAX(Case when UserDefinedFieldInternalID = 14 then Value end) as YourSecondDateColumn
    from SomeTable s
    group by s.ObjectInternalID
)
where YourColumnThatMightBeAName = 'SomeValueToFind'

请记住,由于这是一个EAV,当它们是不同的数据类型时,您必须转换/转换值。

Where convert(datetime, YourDateColumn) <= '20160225'

如果需要插入临时表,则应考虑将字符串数据转换为适合内容的数据类型。以下是语法以及如何转换两个日期时间值。

select s.ObjectInternalID
    , convert(datetime, MAX(Case when UserDefinedFieldInternalID = 3 then Value end)) as YourDateColumn
    , MAX(Case when UserDefinedFieldInternalID = 4 then Value end) as YourFirstSmudgedColumn
    , MAX(Case when UserDefinedFieldInternalID = 2 then Value end) as YourColumnThatMightBeAName
    , MAX(Case when UserDefinedFieldInternalID = 66 then Value end) as YourSecondSmudgedColumn
    , convert(datetime, MAX(Case when UserDefinedFieldInternalID = 14 then Value end)) as YourSecondDateColumn
INTO #SomeTempTable
from SomeTable s
group by s.ObjectInternalID

答案 1 :(得分:1)

您可以在表上创建一个视图来进行拆分 - 看起来好像字段UserDefinedFieldInternalID和字段内容具有很强的相关性,至少就数据类型而言 - 所以,假设你想要要提取一组有限的UserDefinedFieldInternalID,您可以构建一个类似于:

的视图
select d2.value, d14.value from thistable d2 join thistable d14 on d2.internalobjectid = d14.internalobjectid
where d2.value = 'his name' and
d2.UserDefinedFieldInternalID = 2 and
d14.UserDefinedFieldInternalID = 14 and
d14.value > "date range"

我怀疑在其他地方,那里有一个参考表,您可以在其中找到UserDefinedFieldInternalID与类型列表的连接,因此您可以将其整合到一起进行整理

这种表示数据的方式在用户可以在某些方面定义自己的模式的应用程序中完全有效 - 它不能很好地扩展所有模式,但在小型/精品实现中,这不是问题(至少不是前几个月/年)

[编辑] 为了汇总其他答案的布局 - 这里是编写上面代码的另一种方式 - 我已经将连接更改为左连接,这样如果没有匹配的值,它只是将结果值留空。

create view user_schema_query_view1 as
select 
s.ObjectInternalID
d3.value as date1,
d4.value as resident1,
d66.value as attending1,
d14.value as date2, 
from
DocUserDefinedData s 
left join DocUserDefinedData d3 on s.ObjectInternalID = d3.ObjectInternalID and 
d3.ObjectInternalID = 3
left join DocUserDefinedData d4 on s.ObjectInternalID = d4.ObjectInternalID and 
d3.ObjectInternalID = 4
left join DocUserDefinedData d66 on s.ObjectInternalID = d66.ObjectInternalID and 
d3.ObjectInternalID = 66
left join DocUserDefinedData d14 on s.ObjectInternalID = d14.ObjectInternalID and 
d3.ObjectInternalID = 14

然后,您可以使用如下语句查询视图:

select * from user_schema_query_view1
where date1 = "some-date-value" and attending1 = "something else"

首先尝试使用该结构,然后,如果它适合,您可以尝试将数据转换为更有用的数据类型。