2016-02-24 28 views
0

我不知道如何做這個查詢。我需要獲取大量信息,但它都在一列中。如果桌面向右旋轉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 

如果我註釋掉成部分,它運行,但除此之外,我得到一個「不正確syntac‘’錯誤。我不明白

+0

如何將一行中的值與另一行中的值相關聯?基於ObjectInternalID值? –

+0

所以你想'values>「日期範圍」或「>日期」?這些值又是什麼混淆?因爲如果沒有日期會很難比較 –

+0

你的問題沒有多大意義,但你應該檢查'PIVOT' –

回答

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 
+0

這創建了一張看起來不錯的表格。但是,我現在如何使用新列名添加where子句?例如。 'YourDateColumn>'2016-01-01''在哪裏。我試過了,它說列不存在。我是否必須首先創建一個視圖表,如下面的答案所示? – Frantumn

+0

我已經將SQL現在添加到了這個問題 – Frantumn

+1

@Frantumn我編輯了我的答案以及如何做到這一點。 –

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" 

首先嚐試了這一點的結構,然後,如果適合,你可以嘗試在數據澆鑄成工作更有用的數據類型。

+0

聽起來像我需要一個你有什麼和其他答案有什麼組合。儘管我試圖製作一張臨時表,但我仍然陷入困境,我更新了我的帖子以顯示我的內容。有任何想法嗎? – Frantumn

+0

我會探索這種技術,它的作用是將單個表格剝離成一系列連接的表格,其中每個連接都是由UserDefinedFieldInternalID進行過濾的集合 - 一旦您滿意地將其與所有你可以將它包含在'create view myview as select ...'語句中 - 然後你可以用如下語句來查詢它:'從myview中選擇a,b,c其中a ='something'一旦創建,就有了「實現」視圖的方法,這些方法可以使視圖更快(實質上使臨時表不在其中),但它們是特定於數據庫的。 –

相關問題